你好了解更多placement new
、operator new
、表达式delete
..并将初始化与构造分离,我试过这个例子:
int main(){
int* p = static_cast<int*>(operator new[](10 * sizeof(int)));
p = new(p)int[10];
for(int i = 0; i != 10; ++i)
p[i] = i * 7;
for(int i = 0; i != 10; ++i)
std::cout << p[i] << ", ";
operator delete[](p);
}
我已经编译并运行了它,它运行良好,并使用 Valgrind 检查了它是否存在内存泄漏,没有报告任何错误。那么它是如何将初始化与分配分开的?
我不确定的是我使用运算符 delete 来释放动态数组的内存但没有销毁它(没有放置删除)。那么我的代码中有什么不好的地方吗?
答案 0 :(得分:2)
正如您所指出的,没有 placement delete
。使用 placement new
时,必须手动调用析构函数,例如:
void* mem = operator new[](10 * sizeof(T));
T* p = new(mem) T[10];
...
for(int i = 0; i < 10; ++i)
p[i].~T();
operator delete[](mem);
其中 T
是所需的元素类型。
对 POD 类型(如 int
)调用析构函数不是很重要,但对于非 POD 类型(如 std::string
等)来说,避免泄漏很重要。