【问题标题】:Do i need to delete a object that was constructed with new and placement我需要删除一个用 new 和placement 构造的对象吗
【发布时间】:2015-10-17 13:27:40
【问题描述】:
class Foo{
//some member
    public:
    int bar;
}

int main(){
    char* buffer = new char[100];
    Foo* f = new(buffer)Foo();
//do i have to
    delete f;
//or is 
    delete[] buffer;
//enough
}

如果Foo 的删除对系统有一些重大影响,我当然必须删除它,但可以说它是一个简单的存储对象,我将它完全放置在缓冲区内并且没有解构函数会删除一些其他的东西。

  • 我是否必须删除一个放置在新内部的对象 缓冲区还是删除缓冲区就足够了?
  • 如果我必须对缓冲区内的每个对象调用 delete,为什么要这样做 我必须这样做吗?

我读到:what-uses-are-there-for-placement-new 他也说

您不应该取消分配正在使用内存缓冲区的每个对象。相反,您应该只删除[] 原始缓冲区。

【问题讨论】:

    标签: c++ memory memory-management new-operator placement


    【解决方案1】:

    销毁该对象的正确方法是显式调用析构函数:

    f-> ~Foo();
    

    通常放置 new 与堆栈上的内存一起使用。在这种情况下,它是堆分配,因此您需要使用与new 匹配的delete 的形式来释放缓冲区。

    delete[] buffer;
    

    【讨论】:

    • 所以如果我使用放置,我需要显式调用析构函数。但问题是为什么我需要这样做,它的堆栈或堆是否重要?好吧,确定我是否需要调用它的堆删除,但是这对我需要做的~Foo() 调用有影响吗?
    • @BennX: f->~Foo() 在您的情况下似乎没有任何操作,但如果您在 Foo 中有 std::string,则它不再是真的,您将有泄漏。
    • @BennX Placement new 将分配与初始化分开。本质上,由于您使用两个步骤创建了对象,因此销毁它需要相反的两个步骤。 delete f 可能在实践中有效,因为指针值恰好匹配,但这是未定义的行为:不能保证有效。整洁和正确总比简洁好。
    • @Jarod42 我明白了。当然,在这种情况下我需要调用删除。但如果我只有简单的类型? (在我想使用它的情况下,它只包含简单类型)
    • 在这种情况下,~Foo() 是空操作,编译器会将其优化掉。
    猜你喜欢
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    相关资源
    最近更新 更多