C++面试深度解析:new、delete与malloc、free的差异

需积分: 10 4 下载量 78 浏览量 更新于2024-07-22 收藏 483KB PDF 举报
"C++面试宝典" 在C++编程中,理解和掌握动态内存管理是至关重要的,这在面试中也经常被考察。本资源详细整理了C++面试中关于内存管理的一些常见问题,特别是new、delete、malloc和free的关系以及delete和delete[]的区别。 首先,new和delete是C++中的运算符,负责对象的动态内存分配和释放,同时会调用构造函数和析构函数。new操作符不仅分配内存,还确保对新创建的对象进行初始化,而delete在释放内存前会调用析构函数。相比之下,malloc和free是C语言的标准库函数,仅处理内存的分配和释放,不涉及对象的构造和析构。由于C++支持类和对象的概念,malloc和free不能处理对象的生命周期管理,因此对于非内部数据类型,单纯使用malloc和free是不够的。 其次,delete和delete[]的主要差异在于处理数组对象的方式。delete只会调用一次析构函数,适用于单个对象的销毁;而delete[]则会为数组中的每个元素调用析构函数,然后释放整个内存块。这意味着,如果你使用new[]分配的内存,必须使用delete[]来释放,反之亦然。不匹配使用可能导致未定义的行为,例如,删除自定义类型数组时使用delete而不是delete[],析构函数可能不会被正确调用,导致资源泄露。 举例来说: ```cpp MemTest *mTest1 = new MemTest[10]; // 动态分配 MemTest 类型的数组 MemTest *mTest2 = new MemTest; // 动态分配单个 MemTest 对象 int *pInt1 = new int[10]; // 动态分配 int 类型的数组 int *pInt2 = new int; // 动态分配单个 int 值 // 正确的释放方式 delete[] pInt1; // 释放 int 类型数组 delete[] mTest1; // 释放 MemTest 类型数组 delete pInt2; // 释放单个 int 值 delete mTest2; // 释放单个 MemTest 对象 // 错误的释放方式(可能导致问题) // delete pInt1; // 不应该,应使用 delete[] pInt1 // delete mTest1; // 不应该,应使用 delete[] mTest1 // delete[] pInt2; // 不应该,应使用 delete pInt2 // delete[] mTest2; // 不应该,应使用 delete mTest2 ``` 在上面的例子中,如果尝试使用delete释放用new[]分配的内存(如-4-所示),或者用delete[]释放非数组对象(如-2-所示),程序会出现错误或未定义行为,因为析构函数的调用和内存释放的顺序不符合预期。 C++中的动态内存管理是通过new和delete运算符来实现的,它们负责对象的构造和析构。对于C++的类类型,使用new和delete是必要的,因为它们可以处理对象的生命周期。而malloc和free仅处理基本数据类型的内存分配,不支持对象的构造和析构。在处理数组时,务必使用对应的delete[]以确保所有元素的析构。理解这些概念对于避免内存泄漏和提高代码质量至关重要。