注意
- new会调用构造函数,malloc不会调用构造函数
- delete会调用析构函数,free不会调用析构函数
- free只是释放了对象所在的内存空间,如果自定义类型中的成员变量管理了资源,将无法释放该资源,会产生内存泄露(因为没有调用析构函数)
- delete[] 在自定义类型中只要没有和new[]匹配使用就会运行时出错
- malloc申请空间时不会调用构造函数,申请的是与对象大小相同的一块内存空间,不能讲该块内存空间看成是一个对象
- 使用delete释放malloc创建的对象时,会调用析构函数清理对象中的资源,如果自定义类型中的成员变量管理了资源,将会报错,因为malloc没有调用构造函数,没有给管理资源的变量申请内存,此时释放空间当然会出错
- 使用_CrtDumpMemoryLeaks()函数可以检测是否有内存泄露,以及泄露了几个字节
以下代码能深刻理解这几点
// new会调用构造函数
// free不会调用析构函数--对象中的资源不会被销毁
void Test2()
{
Test* p3 = new Test;
Test* p4 = new Test;
free(p3); //free只是释放了对象所在的内存空间,如果自定义类型中的成员变量
//管理了资源,将无法释放该资源,会产生内存泄露(因为没有调用析构函数)
delete[] p4; //delete[] 在自定义类型中只要没有和new[]匹配使用就会运行时出错
// malloc申请空间时不会调用构造函数--申请的是与对象大小相同的一块内存空间
// 不能讲该块内存空间看成是一个对象
Test* p1 = (Test*)malloc(sizeof(Test));
Test* p2 = (Test*)malloc(sizeof(Test));
delete p1; // 会调用析构函数清理对象中的资源,如果自定义类型中的成员变量
//管理了资源,将会报错,因为malloc没有调用构造函数,没有给管
//理资源的变量申请内存,此时释放空间当然会出错。
delete[] p2; //delete[] 在自定义类型中只要没有和new[]匹配使用就会运行时出错
Test* p5 = new Test[10];
Test* p6 = new Test[10];
free(p5); //free释放new[]创建的运行时会出错
delete p6; //delete释放new[]创建的运行时会出错
_CrtDumpMemoryLeaks();
}