c++ - 在这种情况下显式调用时,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 语句的影响吗?
解决方案
f.~Foo();
f.~Foo();
不。只是不要。这是不好的。很坏。永远不要那样做,尤其是当你不明白什么是析构函数时。
编译器只是跳过代码,因为这是未知领域,在这种情况下它会做任何它想做的事情。
推荐阅读
- mongodb - 如果事务被中止(MongoDB.Driver 和 .NETCore),则在数据库中创建记录
- php - 如何使用 websocket io 只交互两个屏幕
- r - R MYSQL-UTF 8 中的 DBwrite 表错误
- excel - Excel VBA复制匹配条件单元格并根据不同工作表中的条件粘贴到特定单元格中
- javascript - Javascript替换字符串中的多个字符无法按预期工作
- css - Safari 浏览器的底部边框渐变支持
- laravel - 使用laravel和vue js的多个文件上传错误不打印
- java - Kafka 流聚合:如何忽略 Window 的中间聚合结果
- python - CSRF 令牌在运行时延长令牌到期时间
- google-cloud-platform - 从谷歌存储中的多个文件夹创建多个 bigquery 表