当我们创建一个类类型的动态数组时,我正在研究这种情况。正如我所知,没有一个方法可以在直接调用类的非默认构造函数时创建数组。一种方法是用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调试器中,代码运行没有问题,但我担心可能的内存泄漏或删除比已经分配的更多的内存。
1条答案
按热度按时间pod7payv1#
我想知道是否可以按以下方式释放内存:
答案是“不”。
要使用
delete[]
运算符,必须使用new[]
* 运算符 * 对其进行分配和初始化。将
delete
与new
匹配,将delete[]
与new[]
匹配。如果显式调用operator new
或operator new[]
函数,则必须使用相应的delete函数。任何其他行为都会导致“未定义的行为”。