析构函数是否自动为成员变量解除分配堆内存
Does a destructor automatically deallocates heap memory for member variables?
我对析构函数有一些疑问。
class cls
{
char *ch;
public:
cls(const char* _ch)
{
cout<<"nconstructor called";
ch = new char[strlen(_ch)];
strcpy(ch,_ch);
}
~cls()
{
//will this destructor automatically delete char array ch on heap?
//delete[] ch; including this is throwing heap corruption error
}
void operator delete(void* ptr)
{
cout<<"noperator delete called";
free(ptr);
}
};
int main()
{
cls* cs = new cls("hello!");
delete(cs);
getchar();
}
此外,由于析构函数是在删除时自动调用的,为什么当所有逻辑都可以在析构函数中编写时,我们需要显式删除?
我对运算符删除和析构函数感到非常困惑,无法弄清楚它们的具体用法。详细的描述将非常有帮助。
编辑:我基于答案的理解:对于这种特殊情况,默认析构函数会损坏 char 指针,因此我们需要先显式删除 char 数组,否则会导致内存泄漏。如果我错了,请纠正我。
好吧,默认析构函数会释放成员变量使用的内存(即成员指针本身ch
不复存在(,但它不会自动释放成员指针引用的任何内存。所以你的例子中存在内存泄漏。
delete
不是一个函数(尽管你可以重载它(;是的,在析构函数中编写释放的逻辑是一种很好的做法。但是,假设析构函数将自动执行释放是不正确的。问题是析构函数将在对象的生存期结束时被调用,但它的作用取决于您为其编写的代码。也就是说,您应该在析构函数中调用delete[]
ch
:
~cls()
{
delete[] ch;
ch = nullptr;
}
此外,我相信堆损坏错误来自这样一个事实,即您在初始化ch
时没有为空字节