gpt4 book ai didi

c++ - 在 C++ 中放置新的 VS 显式构造函数调用

转载 作者:太空狗 更新时间:2023-10-29 20:06:58 26 4
gpt4 key购买 nike

最近我遇到了这两种在内存中特定位置创建对象的方法:
1.

void* mem = malloc(sizeof(T));
T* obj = new(mem) T();


2.

T* obj = (T*)malloc(sizeof(T));
*obj = T();

第二种方式有点短……还有其他区别吗?问候马特乌斯

最佳答案

第二种方式错误,第一种方式正确。

您正在对包含垃圾数据的 T 实例调用赋值运算符。赋值运算符期望实例已正确初始化 - 它可以例如在分配之前删除成员变量,这会导致各种有趣的崩溃。参见例如:

struct Foo {
std::string * Data;
Foo() : Data(0) {}
Foo(Foo const & R) { Data = new std::string(*R.Data); }
~Foo() { delete Data; }
Foo & operator=(Foo const & R) {
delete Data;
Data = new std::string(*R.Data);
return *this;
}

};

第一种方法将确保调用 Foo::Foo() - 从而正确初始化 Data。第二种方法将导致 delete Data;,其中 Data 指向内存中的某个随机位置。

编辑:

您可以通过以下方式进行测试:

void* mem = malloc(sizeof(Foo));
memset(mem, 0xCC, sizeof(Foo)); // malloc doesn't guarantee 0-init
Foo* obj = new(mem) Foo();

和:

Foo * obj = (Foo*)malloc(sizeof(Foo));
memset(obj, 0xCC, sizeof(Foo)); // malloc doesn't guarantee 0-init
*obj = Foo(); // Crash

关于c++ - 在 C++ 中放置新的 VS 显式构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5279042/

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