gpt4 book ai didi

c++ - 重用内存位置安全吗?

转载 作者:IT老高 更新时间:2023-10-28 12:14:11 24 4
gpt4 key购买 nike

这个问题是基于一些现有的移植到 C++ 的 C 代码。我只是对它是否“安全”感兴趣。我已经知道我不会这样写。我知道这里的代码基本上是 C 而不是 C++,但它是用 C++ 编译器编译的,我知道标准有时会略有不同。

我有一个分配一些内存的函数。我将返回的 void* 转换为 int* 并开始使用它。

稍后我将返回的 void* 转换为 Data* 并开始使用它。

这在 C++ 中安全吗?

示例:-

void* data = malloc(10000);

int* data_i = (int*)data;
*data_i = 123;
printf("%d\n", *data_i);

Data* data_d = (Data*)data;
data_d->value = 456;
printf("%d\n", data_d->value);

我从不读取通过不同类型使用的变量,但担心编译器可能会看到 data_idata_d 是不同的类型,因此不能合法地为每个变量设置别名其他并决定重新排序我的代码,例如将商店放在第一个 printf 之前的 data_d。这会破坏一切。

但是,这是一种一直使用的模式。如果您在两个访问之间插入 freemalloc 我不相信它会改变任何东西,因为它不会触及受影响的内存本身并且可以重用相同的数据.

我的代码是坏了还是“正确”?

最佳答案

“OK”,它可以按照您编写的方式工作(假设原语和普通旧数据类型 (POD))。这是安全的。它实际上是一个自定义内存管理器。

一些注意事项:

  • 如果在分配内存的位置创建了具有非平凡析构函数的对象,请确保它被调用

    obj->~obj();
  • 如果创建对象,请考虑 placement new syntax在普通类型转换上(也适用于 POD)

    Object* obj = new (data) Object();
  • 检查 nullptr (或 NULL ),如果 malloc失败,NULL被退回

  • 对齐应该不是问题,但在创建内存管理器时始终要注意它并确保对齐合适

鉴于您使用的是 C++ 编译器,除非您想保留代码的“C”性质,否则您也可以查看全局 operator new() .

和往常一样,一旦完成,不要忘记 free() (或 delete 如果使用 new )


您提到您目前还不会转换任何代码;但如果或当你考虑它时,你可能希望在 malloc 上使用 C++ 中的一些惯用特性。甚至全局::operator new .

您应该查看智能指针 std::unique_ptr<> std::shared_ptr<> 并允许他们处理内存管理问题。

关于c++ - 重用内存位置安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35333984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com