【问题标题】:What is the difference between delete and calling destructor in C++C ++中删除和调用析构函数有什么区别
【发布时间】:2013-05-30 07:22:03
【问题描述】:

如标题所述,这是我的代码:

class Foo {

    public:
        Foo (int charSize) {
            str = new char[charSize];
        }
        ~Foo () {
            delete[] str;
        }
    private:
        char * str;
};

对于这个类有什么区别:

int main () {
    Foo* foo = new Foo(10);
    delete foo;
    return 0;
}

和

int main () {
    Foo* foo = new Foo(10);
    foo->~Foo();
    return 0;
}

【问题讨论】:

  • 你永远不应该有理由显式调用析构函数,除非在少数情况下你知道你需要这样做。
  • @chris 如解决缺少展示位置删除的问题:stackoverflow.com/questions/6783993/placement-new-and-delete
  • @ScottJones,没错。
  • 我也遇到过类似的情况。我有两个指针,ptr1 和 ptr2,指向堆上的同一个内存位置。我使用 ptr1 显式调用析构函数,但随后我可以使用 ptr2 访问该位置。但是当我在 ptr1 上使用 delete 时,我无法再使用 ptr2 访问我的对象。

标签: c++ memory-management destructor


【解决方案1】:

调用析构函数会释放对象拥有的资源,但不会释放分配给对象本身的内存。第二个代码sn-p有内存泄漏。

【讨论】:

  • “释放对象拥有的资源”是什么意思?文件、锁之类的东西?
  • @heretoinfinity 在大多数情况下,它是动态分配的内存,用于在对象本身之外存储东西,但文件和锁也是很好的例子。
  • 我有点困惑,需要澄清一下。您的答案中的“第二个 sn-p”是指delete foo; 或foo->~Foo(); 的行吗?析构函数foo->~Foo() 是否没有释放内存并且因为析构函数有delete 语句?
  • @heretoinfinity foo->~Foo() 不会为对象本身释放动态内存。它确实为str 释放了内存。
【解决方案2】:

每当调用析构函数时,分配给对象的内存不会被释放,但程序中不再可以访问该对象。 但是 delete 会从内存中完全删除对象。

【讨论】:

    猜你喜欢
    • 2020-04-18
    • 1970-01-01
    • 2020-10-18
    • 2023-03-10
    • 2021-06-01
    • 2023-03-18
    • 2010-09-25
    • 1970-01-01
    • 2021-08-30
    相关资源
    最近更新 更多