c++ 删除用placement新建构造的数组元素

enxuqcxy  于 2023-05-24  发布在  其他
关注(0)|答案(1)|浏览(128)

当我们创建一个类类型的动态数组时,我正在研究这种情况。正如我所知,没有一个方法可以在直接调用类的非默认构造函数时创建数组。一种方法是用normalize初始化数组,然后循环并调用每个对象的非默认构造函数,但我认为这种方法的开销很大。在寻找解决方案后,我使用placement new发现了以下内容:

void* memory = operator new[](sizeof(Test) * 8);  // Allocate raw memory for 8 objects
Test* arr = static_cast<Test*>(memory);  //Convert to desired type
// Construct objects using placement new

for (int i = 0; i < 8; i++) {
    new (&arr[i]) Test(9);  //Assume Test has constructor Test(int)
}

// Use the initialized array

for (int i = 0; i < 8; i++) {
    arr[i].~test();  // Explicitly call destructor for each object
}
operator delete[](memory);  // Deallocate memory

我想知道是否可以按以下方式释放内存:

delete[] arr;
/*instead of 
for (int i = 0; i < 8; i++) {
    arr[i].~test();
}
operator delete[](memory); */

我在VS2022中测试了它,但我想确保这种方法没有问题。
在VS调试器中,代码运行没有问题,但我担心可能的内存泄漏或删除比已经分配的更多的内存。

pod7payv

pod7payv1#

我想知道是否可以按以下方式释放内存:

delete[] arr;

答案是“不”。
要使用delete[]运算符,必须使用new[] * 运算符 * 对其进行分配和初始化。
deletenew匹配,将delete[]new[]匹配。如果显式调用operator newoperator new[]函数,则必须使用相应的delete函数。任何其他行为都会导致“未定义的行为”。

相关问题