结构对象析构函数

Struct object destructor

本文关键字:析构函数 对象 结构      更新时间:2023-10-16

如果我要定义这样的结构:

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的析构构函数体之后调用。