C++中new/delete/malloc/free知识总结

注意

  • 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();
}
发布了157 篇原创文章 · 获赞 53 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_42837885/article/details/101127056