【发布时间】:2015-02-04 06:30:55
【问题描述】:
C++:类析构函数有什么作用?
假设我们有一个对象“myObject”,并且有如下几个成员:
int a;
float b;
yourClass yourObject;
void hisMethod();
从我读到的,分配给“myObject”的内存是这样的顺序。
一旦调用析构函数,发生了什么?
在调用析构函数之后,在对象被销毁之前,从我阅读的内容来看,我仍然可以访问 (a) 对象“myObject”。 (b) 成员 yourObject (c) 成员 hisMethod()
我还能访问其成员吗?这是未定义的行为?
许多 C++ 书籍没有详细讨论它。 我在哪里可以找到有关它的更多详细信息?因为细节可以帮助我理解许多 C++ 规则,例如“除非在放置 new 之后,否则不要手动调用析构函数”。
[更新 1] 我提出我的问题是因为我看到了这个帖子: What does empty destructor do? 海报举例如下:
#include <iostream>
#include <set>
class a
{
public:
std::set <int> myset;
};
int main()
{
a object;
object.myset.insert(55);
object.~a();
object.myset.insert(20);
std::cout << object.myset.size();
}
海报获得: “* glibc detected * /.app: double free or corruption (fasttop):”,然后是“ABORT”。
这意味着:
object.myset.insert(20);
不会引发错误,这意味着手动调用析构函数后对象仍然存在。 它的类成员仍然可以被调用!
两次调用解构函数会报错。
[更新 1] 我在 QT Creator 中运行代码,当运行到 object.myset.insert(20);
它引发错误:
读取访问冲突:0x0,flags=0x0。
【问题讨论】:
-
调用 dtor 会结束对象的生命周期。不要对它做任何事情。
-
“在调用析构函数之后,在对象被销毁之前”——你的意思是什么?根据定义,析构函数会销毁对象。
-
@Deduplicator。我知道规则。我只是想了解底层机制。
-
@5gon12eder,你确定对象被破坏了吗?根据我的阅读,情况并非如此。
-
我们必须澄清销毁对象的含义。调用析构函数后,对象的生命周期已经结束,对它的任何操作都将调用未定义的行为。编译器不能(也不应该)捕获所有此类滥用(例如在您更新的帖子中的示例),因此它可能会愉快地编译代码,但在执行时可能会发生任意坏事。仅仅因为某些东西可以编译(甚至运行),这并不意味着它是有效的 C++。
标签: c++ class destructor