C ++:类析构函数做了什么?
假设我们有一个对象“myObject”,并且有几个成员如下:
int a;
float b;
yourClass yourObject;
void hisMethod();
根据我的阅读,分配给“myObject”的内存就像这个顺序。
一旦调用了析构函数,会发生什么?
在调用析构函数之后,在对象被销毁之前,从我读到的内容,我仍然可以访问 (a)对象“myObject”。 (b)成员yourObject (c)成员hisMethod()
我还可以访问其成员吗?这是不确定的行为?
许多C ++书籍都没有详细介绍它。 我在哪里可以找到更多细节?因为细节可以帮助我理解许多C ++规则,比如“除非在放置新内容后手动调用析构函数”。
[更新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检测到* /.app:双重免费或腐败(fasttop):”然后“ABORT”。
这意味着:
object.myset.insert(20);
不会引发错误,这意味着在手动调用析构函数后对象仍然存在。 它的类成员仍然可以被调用!
双重调用解构器会产生错误。
[Update 1]我在QT Creator中运行代码,当运行到object.myset.insert(20)时;
它引发错误:
读取访问冲突:0x0,flags = 0x0。
答案 0 :(得分:0)
如果是yourClass yourObject;
,则无法在销毁后访问您的对象,
因为编译器会在你执行之前抱怨
在这种情况下(自动存储持续时间),范围是对象的生命周期,因此在销毁之后,您将进入代码部分,其中不再知道您的对象名称。
(析构函数和释放的实际内存是分开的,但两者都是连续发生的,没有任何可能性在它们之间放置一些自己的代码)。
如果你有一些指针,分配了一些new
和delete
它:
是的,在delete
之后访问它是未定义的行为。
答案 1 :(得分:0)
类析构函数,即名为~class的方法,可以执行任何您要求它执行的操作。它不会释放内存。
析构函数作为销毁对象的过程的一部分被调用,此过程通常还会在析构函数运行后释放与该对象关联的内存。根据对象的创建位置和方式,将发生不同的“释放”记忆: