【问题标题】:What is the difference between delete and calling destructor in C++C ++中删除和调用析构函数有什么区别
【发布时间】:2025-12-25 20:45:17
【问题描述】:

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

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 如解决缺少展示位置删除的问题:*.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 会从内存中完全删除对象。

【讨论】: