在C++中,delete和调用析构函数有什么区别?

15

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

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
@chris 比如解决没有放置删除的问题:https://dev59.com/g2w15IYBdhLWcg3wLIo2 - Scott Jones
@ScottJones,没错。 - chris
我也遇到了类似的情况。我有两个指针,ptr1和ptr2,它们都指向堆上的同一内存位置。我使用ptr1显式调用析构函数,但是之后我仍然可以使用ptr2访问该位置。但是当我使用ptr1上的delete操作时,我就无法再使用ptr2访问我的对象了。 - soheil_ptr
2个回答

24

调用析构函数可以释放对象所拥有的资源,但它并不会释放分配给对象本身的内存。第二段代码片段存在内存泄漏。


“释放对象所拥有的资源”是什么意思?例如文件、锁之类的东西? - heretoinfinity
1
在大多数情况下,它是用于存储对象本身之外的东西的动态分配内存,但文件和锁也是很好的例子。@heretoinfinity - Sergey Kalinichenko
我有些困惑,需要澄清。在你的回答中,“第二个片段”是指delete foo;还是foo->~Foo();这一行?析构函数foo->~Foo()不会释放内存吗?因为析构函数中有delete语句。 - heretoinfinity
1
@heretoinfinity foo->~Foo()不会释放对象本身的动态内存,但会释放str的内存。 - Sergey Kalinichenko

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接