首页 > 解决方案 > 在这种情况下显式调用时,std::cout 如何改变析构函数的行为?

问题描述

我正在尝试显式调用对象的析构函数。以下代码按预期工作:

class Foo {
    public:

    ~Foo() {
        x_=x_+10;
        std::cout << "x_ = " << x_ << std::endl;
    }

    int x() {
        return x_;
    }
    int x_=0;
};


int main()
{
    Foo f;
    std::cout << "f.x() = " << f.x() << std::endl;

    f.~Foo();
    f.~Foo();

    std::cout << "f.x() = " << f.x() << std::endl;
    return 0;
}

打印输出是:

f.x() = 0                                                                                                                                                      
x_ = 10                                                                                                                                                        
x_ = 20                                                                                                                                                        
f.x() = 20                                                                                                                                                     
x_ = 30

正如预期的那样,每次调用析构函数时,x_ 都会增加 10,因此我们看到了从 10 到 20 到 30 的进展。

但是,如果我们std::cout从析构函数中删除 ,例如:

class Foo {
    public:

    ~Foo() {
        x_=x_+10;
    }

    int x() {
        return x_;
    }
    int x_=0;
};


int main()
{
    Foo f;
    std::cout << "f.x() = " << f.x() << std::endl;

    f.~Foo();
    f.~Foo();

    std::cout << "f.x() = " << f.x() << std::endl;
    return 0;
}

然后打印输出变为:

f.x() = 0                                                                                                                                                      
f.x() = 0 

析构函数中的增量不再起作用。有人可以解释为什么析构函数的行为会受到 print 语句的影响吗?

标签: c++oopprintfdestructorcout

解决方案


f.~Foo();
f.~Foo();

不。只是不要。这是不好的。很坏。永远不要那样做,尤其是当你不明白什么是析构函数时。

编译器只是跳过代码,因为这是未知领域,在这种情况下它会做任何它想做的事情。

显式析构函数调用不起作用


推荐阅读