C++:类析构函数做什么
C++: What does the class destructor do?
>C++:类析构函数是做什么的?
假设我们有一个对象"myObject",并且有几个成员,如下所示:
int a;
float b;
yourClass yourObject;
void hisMethod();
从我读到的内容来看,分配给"myObject"的内存是这样的顺序。
调用析构函数后,会发生什么?
在调用析构函数之后,在对象被销毁之前,从我读到的内容来看,我仍然可以访问(a( 对象"我的对象"。(b( 会员您的对象(c( 成员他的方法((
我还能访问其成员吗?这是未定义的行为?
许多C++书都没有谈论更多关于它的细节。我在哪里可以找到更多详细信息?因为细节可以帮助我理解许多C++规则,例如"除非放置新后,否则不要手动调用析构函数"。
[更新1] 我提出我的问题,因为我看到了帖子:空析构函数有什么作用?海报给出了如下示例:
#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);
不会引发错误,这意味着在手动调用析构函数后对象仍然存在。它的类成员仍然可以被调用!
解构函数的双重调用会产生错误。
[更新 1] 我在 QT Creator 中运行代码,当运行到 object.myset.insert(20( 时;
它引发错误:
读取访问冲突:0x0,标志=0x0。
在yourClass yourObject;
的情况下,销毁后无法访问你的对象,
因为编译器会在您开始执行之前抱怨。
在本例中(自动存储持续时间(,范围是对象的生存期,因此销毁后,您处于一个代码部分,其中的名称 yourObject 不再为人所知。
(析构函数和实际内存释放是分开的,但两者都是连续发生的,没有任何可能在它们之间放置一些自己的代码(。
如果你有一些指针,分配了一些东西 new
,以及delete
它:
是的,在delete
之后访问它是未定义的行为。
类析构函数,即名为~class的方法,可以执行您要求它执行的任何操作。它不会释放内存。
析构函数作为销毁对象过程的一部分调用,此过程通常还会在其析构函数运行后释放与对象关联的内存。根据对象的创建位置和方式,将发生不同的内存"释放":
- 在堆栈上,内存由堆栈帧指针更新隐式释放
- 在堆上,它将通过将内存释放回堆来释放
- 对于静态,内存并没有真正释放
- 什么时候调用组成单元对象的析构函数
- 什么时候调用析构函数
- C++:使用方法调用析构函数的顺序是什么?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 在析构函数中删除单链表的正确方法是什么?
- 拥有"受保护的非虚拟析构函数"与"受保护虚拟析构构函数"有什么好处
- 什么是带有友元说明符的析构函数
- 我们什么时候应该在 C++ 中将析构函数声明为 =DELETE
- 当声明了虚拟析构函数但没有实现时会发生什么情况
- 我不明白析构函数有什么问题?
- 在C++中为临时库调用析构函数的顺序是什么
- 如果我在析构函数中创建一个对象,会发生什么
- 有人可以解释一下这里发生了什么(类和构造函数/析构函数)吗?
- 虚拟析构函数的用途是什么
- 可观察行为和未定义行为 -- 如果我不调用析构函数会发生什么?
- Qt:写这个类的析构函数的正确和安全的方法是什么
- 什么应该在一个适当的析构函数中
- 在C++中,析构函数的调用顺序和成员变量的销毁顺序是什么
- 我们什么时候必须在派生类 c++ 中定义析构函数
- "= default"析构函数和空析构函数有什么区别?