使用运算符 new 和placement new 分配与构造一个整数数组

时间:2021-06-02 22:33:01

标签: c++ new-operator delete-operator placement-new

你好了解更多placement newoperator 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 来释放动态数组的内存但没有销毁它(没有放置删除)。那么我的代码中有什么不好的地方吗?

1 个答案:

答案 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 等)来说,避免泄漏很重要。