我有几个关于析构函数的疑问。
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();
}
同时,由于在删除时析构函数会自动调用,为什么我们需要显式删除,当所有逻辑都可以写在析构函数中时?
我对delete运算符和析构函数感到非常困惑,无法理解它们的具体用途。详细的描述将非常有帮助。
编辑:根据答案,我的理解是:对于这种情况,默认析构函数会损坏char指针,所以我们需要先显式删除char数组,否则会导致内存泄漏。如果我错了,请纠正我。
new[]
和free
。new[]
必须与delete[]
配对使用。 - DCoderch = new char[strlen(_ch)+1]
来考虑由strlen
复制的空字符。 - quamranaoperator delete
。 - Mr Lister