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

我对析构函数有一些疑问.
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本身不再存在),但它不会自动释放成员指针引用的任何内存.因此,您的示例中存在内存泄漏.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...