结构对象析构函数
Struct object destructor
如果我要定义这样的结构:
struct info{
std::string name;
}
并通过在堆上创建所述结构的新实例
info* i = new info();
字符串的析构函数是否在对信息调用delete时自动调用,从而释放name对象内部分配的任何内存?这种行为在C++中应该避免吗?
感谢
是的,一旦为info
调用delete
,就会自动调用析构函数。但这并不意味着所有的内部内存都将被释放。这里也有例外。
考虑一个案例
struct info
{
char *name;
}
并且在主代码中
int main()
{
info *n = new info;
n->name = new char;
delete n;
}
在这种情况下,name
的内存将不会释放,并且会出现内存泄漏。
@Joachim Pileborg 在评论中链接
销毁顺序
对于用户定义的或隐式定义的析构函数,在执行析构函数体之后,编译器将按与声明相反的顺序为类的所有非静态非变体成员调用析构函数,然后,它按构造的相反顺序调用所有直接基类的析构函数(依次调用其成员及其基类的析构函数等),然后,如果该对象是大多数派生类,它调用所有虚拟基类的析取函数。
因此,为了回答您的问题,是的,name
的析构函数将在调用info
的析构构函数体之后调用。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- C++析构函数调用两次,堆栈分配的复合对象
- 如何从 Gtk::窗口调用派生对象的析构函数
- 为什么数组中对象的析构函数在被另一个对象替换时不被调用?
- 为什么为未删除的对象调用析构函数?
- 对象的构造函数和析构函数
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- C++使用函数对象的线程,如何调用多个析构函数而不是构造函数?
- 从未调用shared_ptr对象的析构函数
- 是否可以在其析构函数中使用指向已销毁对象的指针?
- 使用私有析构函数删除动态分配的对象
- C++ std::线程调用方法,从对象原因到调用此类的析构函数
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- C++ - 析构函数只是释放内存还是实际删除对象
- 受保护的析构函数禁用在堆栈上创建派生类的对象?
- 当 T 具有非平凡析构函数时,类类型 T 的对象是否可以常量初始化?
- 编译器是否在由 new 初始化的对象上调用隐式析构函数
- 受保护析构函数对象在堆vs堆栈上的分配