显式调用析构函数

3

在显式调用析构函数后,我还能访问对象吗?

例如:

class A{
        public:
            A(){
                cout<<"Constructor\n";
                x=5;
            }
            ~A(){
                cout<<"Destructor\n";
            }
        int x;
    };


int main() {
    ios_base::sync_with_stdio(false);

    A obj;
    obj.~A();
    obj.x=4;
    cout<<obj.x<<endl;

    return 0;
}

输出

构造函数 析构函数 4 析构函数

即使调用析构函数,我仍然可以访问obj.x。如果显式调用不销毁对象,那么它是做什么的?


当您调用dtor时,您认为执行了哪些代码?它有什么影响? - Peter - Reinstate Monica
同时定义“销毁”,特别强调数据完整性和内存管理。 - Peter - Reinstate Monica
显式调用析构函数没有销毁我的对象,为什么? - Titus
1个回答

0

它调用了析构函数,但它不会释放内存。内存将在函数结束时被释放。

顺便说一下,如果你不理解发生了什么,你可能不应该这样做:析构函数将在作用域结束时第二次被调用,如果不能调用两次(这通常是情况),可能会导致问题。


即使“释放”内存,通常也无法防止以后访问该内存,就像dtor调用“销毁”对象一样。 - Peter - Reinstate Monica
你不应该操作一个灯开关? - Peter - Reinstate Monica
如果对象仍然存在,析构函数会做什么? - grv95
它在“析构函数”方法中运行代码。销毁对象是一个两步过程:调用其析构函数,然后释放内存。一般来说,如果您一开始没有分配内存(例如使用放置new),那么最后就没有要释放的内存。 - Arkanosis
在您的情况下,对象是栈分配的(您没有使用 new),因此它将在作用域结束时被销毁(即析构函数将被调用),并且内存将在函数结束时被释放。 - Arkanosis
@grv95 定义“存在”。 - Peter - Reinstate Monica

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