如果我要定义一个这样的结构:
struct info{
std::string name;
}
通过以下方法在堆上创建所述struct的新实例:
info* i = new info();
在调用信息删除时是否自动调用字符串的析构函数,以便释放名称对象的任何内部分配的内存?这种行为应该在C ++中避免吗?
由于
答案 0 :(得分:1)
是的,一旦delete
调用info
,就会自动调用析构函数。但这并不意味着将释放所有内部存储器。这里有例外。
考虑一个案例
struct info
{
char *name;
}
并在主代码中
int main()
{
info *n = new info;
n->name = new char;
delete n;
}
在这种情况下,name
的内存将不会被释放,您将有内存泄漏。
答案 1 :(得分:0)
Destruction sequence
对于用户定义或隐式定义的析构函数,在执行析构函数体之后,编译器以声明的相反顺序调用类的所有非静态非变体成员的析构函数然后它按照构造的相反顺序调用所有直接基类的析构函数(反过来调用它们的成员及其基类的析构函数等),然后,如果这个对象是派生最多的类,则调用所有虚拟基地的破坏者。
所以要回答你的问题,是的,name
的析构函数将在调用info
的析构函数体后被调用。