< 返回版块

imxood 发表于 2021-12-13 00:26

以最小的代价把 vec<(u8,u8,u8,u8)> 转化为 vec<vec<u8,u8,u8,u8>>, 内存释放时, 遇到: free(): invalid pointer, 有大佬看看吗?

Rust Playground

https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=35b37959ff4666c34b00d8b1dcdc0dfe

评论区

写评论
作者 imxood 2021-12-18 16:19

不好意思这么久才回复, 最近忙于工作

我这个描述也是有点不太恰当, 我本来是想: 把 vec 这样的数据 转换到 vec<vec<u8,u8,u8,u8>> 这样的数据类型, 如何最快速的实现, 尽量复用数据, 根据我在 Playground 中方法二的实现, 遇到一个问题是: free(): invalid pointer

今天我发现了问题, drop时,会尝试释放vec<vec<u8,u8,u8,u8>>, 但这个内存中的数据是从 vec中leak出来的, 现在会 drop多次 vec内存块中不同的地方, 这在第一个首地址时 是成功的, 但是 下一个地址 偏移了4个字节, 就会失败, 然后我也测试了下, 只能drop首地址, drop这个内存块上的其它地址都会失败, 地址都是无效

这样看起来 我的想法是很难实现了

--
👇
Pikachu: 我想先确认一下,你真的打算对tuple做unsafe操作吗?tuple的内存布局是没有任何保证的,rust编译器可以随意重排字段来进行优化。

相关参考链接:

  1. https://doc.rust-lang.org/reference/type-layout.html#tuple-layout
  2. https://rust-lang.github.io/unsafe-code-guidelines/layout/structs-and-tuples.html#tuple-types
Pikachu 2021-12-13 07:44

我想先确认一下,你真的打算对tuple做unsafe操作吗?tuple的内存布局是没有任何保证的,rust编译器可以随意重排字段来进行优化。

相关参考链接:

  1. https://doc.rust-lang.org/reference/type-layout.html#tuple-layout
  2. https://rust-lang.github.io/unsafe-code-guidelines/layout/structs-and-tuples.html#tuple-types
1 共 2 条评论, 1 页