不带有指针的类:可以不用实现析构函数,拷贝构造函数,拷贝赋值函数,因为对象的内容则是对象的全部。
带有指针的类:一定要实现析构函数,拷贝构造函数,拷贝赋值函数,因为对象的内容不仅包含了对象本身,而且包含了指针指向的动态分配的内存地址。如果不是实现 big tree 函数,则对象在离开作用域后结束声明周期会产生内存泄露,拷贝赋值和拷贝构造会造成指针指向相同的动态内存区域。
析构函数
释放构造函数申请的内存。(当析构函数设置为protected 或是 private ,无法在栈中定义对象,想要在禁止在堆中创建对象,则将 operator new (size_t ) 函数删除 )
栈的内存:对象占用的内存是在栈中,当内存离开作用域之前会调用相对应的析构函数。
堆的内存:在使用堆的内存创建对象常用的两个 操作符 new delete 。
new : 先申请内存,在创建对象。(1.申请内存, 2.将内存转化为相应的对象类型,3.调用构造函数创建对象)
delete: 先删除对象,在删除内存。(1.调用析构函数, 2.释放内存)
注意点:
p = new type(); 创建type类型对象并且初始化
delete p;删除type类型对象
p = new type[n] ; 创建type类型对象数组,大小为 n
delete[] p; 删除type类型对象数组
new delete 要成对存在,当创建的是单一对象,则释放单一对象,当创建对象数组时,要释放对象数组。如果创建对象数组,只删除单一对象,会造成对象调用析构函数的次数不够(对象有指向的内存空间没有释放),但是 new 申请的内存会释放完成。