【发布时间】:2016-02-11 08:16:16
【问题描述】:
这个问题是基于一些现有的移植到 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_i 和 data_d 是不同的类型,因此不能合法地相互别名并决定重新排序我的代码,例如将商店放在第一个 printf 之前的 data_d。这会破坏一切。
但是,这是一种一直使用的模式。如果您在两个访问之间插入 free 和 malloc,我认为它不会改变任何内容,因为它不会触及受影响的内存本身并且可以重用相同的数据。
我的代码是坏了还是“正确”?
【问题讨论】:
-
如果 Data 不是 POD,您应该使用placement new (isocpp.org/wiki/faq/dtors#placement-new) 并确保调用了它的析构函数。
-
我想我们可以假设一个数据适合 10000 字节?
-
顺便说一句,我意识到您只是在移植而不是创建代码,但是这种事情是使用联合的绝佳机会,实际上是为它们创建的目的。可能值得在这里使用一个。它还会增加一些小的类型安全性。
标签: c++