gpt4 book ai didi

c++ - 析构函数是否自动为成员变量释放堆内存?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:03:01 28 4
gpt4 key购买 nike

我对析构函数有一些疑问。

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();
}

此外,由于析构函数会在删除时自动调用,所以当所有逻辑都可以写在析构函数中时,为什么我们需要显式删除?

我对 operator delete 和 destructor 非常困惑,无法弄清楚它们的具体用法。详尽的描述会很有帮助。

编辑:我根据答案的理解:对于这种特殊情况,默认析构函数会破坏 char 指针,因此我们需要先显式删除 char 数组,否则会导致内存泄漏。如果我错了,请纠正我。

最佳答案

好吧,默认 析构函数会释放成员变量使用的内存(即成员指针 ch 本身不再存在),但它不会 自动释放成员指针引用的任何内存。因此,您的示例中存在内存泄漏。

关于c++ - 析构函数是否自动为成员变量释放堆内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17642375/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com