为什么要在释放分配给该对象的内存之前调用该对象的默认析构函数?
Why call the default destructor of an object before freeing the memory allocated to that object?
我看到一些代码执行以下操作:
ExampleObject< T > * eo = const_cast< ExampleObject< T > * >(this);
eo->~ExampleObject();
free( eo );
有问题的示例对象已使用放置 new 进行分配。 没有提供用户定义的析构函数,所以我认为这里使用的是编译器提供的默认析构函数。
我不明白为什么有必要在这里调用析构函数。如果我们有一个用户定义的析构函数,它为它的某些类成员解除分配内存,我可以理解这里的用法,但在默认析构函数的情况下,我不知道我们为什么要这样做。
对象的默认析构函数是做什么的,这需要我们在为对象释放分配的内存之前调用它?
对象的默认析构函数做什么
它为对象的数据成员调用析构函数(如果有)。
这将要求我们在释放为对象分配的内存之前调用它?
唯一应该显式调用析构函数的时间是使用预先存在的内存块中的placement-new
构造对象时。 使用placement-new
将对象构造/销毁任务与内存分配/释放分开,因此您需要显式构造和销毁对象,但您不必分配/释放其内存块,您可以在其他地方随心所欲地管理它。
如果您不使用placement-new
来构造对象,而是使用new
来分配 + 构造对象,那么您必须使用delete
销毁 + 解除分配对象(并且您最好使用智能指针、std:unique_ptr
或std::shared_ptr
来为您处理)。
如果您不使用任何形式的new
构造对象,则根本不要尝试手动破坏对象。 该对象位于自动存储中,编译器将为您管理它。
C 分配函数对C++对象一无所知。 与分配所需内存并调用构造函数/析构函数的new
和delete
不同,C 函数所做的只是分配/解除分配可以使用的适当大小的内存量。
因此,当您使用 C 函数时,您必须调用分配函数来获取内存,在其上调用放置 new 以实际构造内存中的对象(这是实际具有该类型的对象所必需的)。 然后,当你完成它时,你需要通过手动调用析构函数来销毁对象(你需要这样做,以便对象的生存期正确结束),然后将指针传递给 free,以便释放内存。
这就是为什么您不应该在C++中使用*alloc
和free
的原因。 它们需要大量额外的工作,并且不是类型安全的。
当对象超出范围时,将自动调用默认析构函数:
- 函数结束
- 程序结束
- 包含局部变量的块结束
- 删除运算符称为
默认析构函数始终调用其成员对象的析构函数(不适用于指向对象的成员变量)。如果我们动态分配内存,它应该由我们处理,否则默认析构函数会清除局部变量。
如果我们不在类中编写自己的析构函数,编译器会为我们创建一个默认析构函数。默认析构函数工作正常,除非我们在类中动态分配了内存或指针。 当一个类包含指向类中分配的内存的指针时,我们应该编写一个析构函数来在销毁类实例之前释放内存。必须执行此操作以避免内存泄漏。
- 对RValue对象调用的LValue ref限定成员函数
- 检查哪个对象调用了另一个对象的对象方法
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- 从 Base 引用对象调用派生类的成员
- 为什么为未删除的对象调用析构函数?
- Qt c++不会为所有对象调用move_slot.为什么?
- 使用在堆栈上创建的对象调用虚拟函数
- 使用基类对象调用Dervied Class函数
- C++:允许临时对象调用非常量成员函数的设计理念是什么?
- 从类中的对象调用类中的函数的最佳方法
- 派生对象调用的 Base 方法的模板推导
- 如何使用单个对象调用具有相同名称的两个类函数
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- 如果类没有任何成员变量,则通过临时对象调用类的成员函数的开销是多少?
- 如何对动态数组中的某些对象调用析构函数
- 如何从列表中存储的对象调用成员函数
- 从线程内的对象调用静态方法
- 从成员对象调用方法
- 当包含它的对象调用其析构函数时,unique_ptr是否未分配
- 从对象调用成员对象,错误:引用非常量值的初始值必须是左值