englefly
2020-12-30
老师,有个问题没有理解 增加了 c 的作用域或主动调用mem::drop(c),会将堆上存储“cccc” 的内存释放(我们假设这个指正地址是0x1234),但这个过程为什么会修改到 d 包含的指针呢? 按照我的理解,d在栈上包含的三个域 地址指针、长度、capacity 都不会因为 drop(c) 而改变,所以我们调用d.push_str()的时候还是应该在原来指针 0x1234 加上 size 找到字符串末尾的地址,然后添加一个 ’c‘。 因此最后打印d,还是应该5个字符,最后一个字符是c。 不知道我的理解怎么错的
共 4 条评论
3
豆沙饼
2021-09-06
事例三真没有看懂, 老师能说得清晰一点吗, 带个图什么的, 听起来觉得讲得很随意啊
共 2 条评论
2
万正宇
2022-04-27
unsafe { *(&b *const as B *const as A) }
Geek_7c4953
2021-06-11
“=”表示按位复制,左边表示目标位置,目标位置是栈就复制到栈,是堆就复制到堆。
Geek_7c4953
2021-06-11
这里的Some(a)是个有趣的问题。 rust的enum是一个tagged union,就是说他会有一个tag值表示他是union中的哪个类型。 当这个enum中所有的位都被占中时,tag就是一个额外的整数。 而当这个enum中,有某个类型有多余的位可以用的时候,tag就是这些多余的位。 在Option<A>中,A的c: bool占用一个字节,但实际的值域只有0和1 ,那么enum就会根据c这个字节的值作为tag来区分union。当c是0或1时,它就是Some(A)。当c是2的时候,它就是None了。
共 1 条评论