【问题标题】:Allocate vs construct an array of ints using operator new and placement new使用 operator new 和placement new 分配与构造整数数组
【发布时间】:2021-06-02 22:33:01
【问题描述】:

您好,了解更多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 检查了它是否存在内存泄漏,没有报告任何不良情况。那么初始化和分配是怎么分开的呢?

  • 我不确定的是我使用 operator delete 来释放动态数组的内存但没有销毁它(没有放置删除)。那么我的代码中有什么不好的地方吗?

【问题讨论】:

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


    【解决方案1】:

    如您所述,没有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 等)避免泄漏很重要。

    【讨论】:

    • 你必须小心这样的代码。一些放置new [] 的实现向新构造的对象数组添加了一个“数组计数”前缀,这会引发所述数组的空间计算。您还假设new(p) T[10] 返回的值等于p。同样,这并不总是正确的。因此,最好在循环中调用放置new 的非数组形式。那么(只要你做对了),什么都不会出错。
    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    相关资源
    最近更新 更多