C++动态内存管理:new、delete与malloc、free的区别

需积分: 10 2 下载量 20 浏览量 更新于2024-07-31 收藏 595KB DOC 举报
"C语言面试宝典" C++中的内存管理是面试中常见的主题,尤其涉及到new、delete、malloc和free这四个关键字。这些关键字在动态内存分配和释放上各有其特性和用途。 1. new 和 delete:new是C++中的运算符,不仅分配内存,还会调用对象的构造函数;而delete负责释放内存,调用析构函数。new与delete是C++为了更好地支持对象生命周期管理而引入的,它们能够确保对象在创建和销毁时执行相应的构造和析构过程。 - new运算符:当使用new分配内存时,如果对象是非内置类型,会先调用构造函数,然后返回一个指向新对象的指针。例如: ```cpp MemTest*mTest1 = new MemTest[10]; // 调用 MemTest 的构造函数10次 MemTest*mTest2 = new MemTest; // 调用 MemTest 的构造函数1次 ``` - delete运算符:当使用delete释放内存时,会先调用析构函数,然后再释放内存。如果使用了new[],则会为每个对象调用析构函数,确保数组中的所有对象都被正确清理。 2. malloc 和 free:malloc和free是C/C++标准库中的函数,仅负责分配和释放内存,不涉及对象的构造或析构。这意味着它们不适用于需要执行构造和析构的复杂对象。例如: ```cpp int*pInt1 = (int*)malloc(10 * sizeof(int)); // 仅分配内存,无构造 int*pInt2 = (int*)malloc(sizeof(int)); // 仅分配内存,无构造 free(pInt1); // 释放内存,无析构 free(pInt2); // 释放内存,无析构 ``` 与new不同,malloc和free不匹配的对象数组可能导致内存泄露或未定义的行为,因为它们不会调用析构函数。 3. delete 和 delete[] 的区别:delete只调用一次析构函数,而delete[]会为数组中的每个元素调用析构函数。因此,当你使用new[]分配数组时,必须使用delete[]来释放,反之亦然。例如: ```cpp delete[] mTest1; // 正确,为数组调用析构函数 delete[] mTest2; // 错误,mTest2 指向单个对象,应使用 delete delete pInt1; // 错误,pInt1 指向数组,应使用 delete[] delete pInt2; // 正确,pInt2 指向单个对象 ``` 4. C、C++和Java的共同点与不同之处:这是一个广泛的话题,通常涉及语法、内存管理、异常处理、面向对象特性等方面。共同点可能包括基本数据类型、流程控制结构等,而不同之处可能包括C++的模板、多重继承、RAII(Resource Acquisition Is Initialization)特性,以及Java的垃圾回收机制、多线程支持和平台独立性等。 5. 继承的优缺点: - 优点: - 代码重用:子类可以继承父类的属性和方法,减少重复代码。 - 多态性:通过子类化,可以实现接口的多种实现,提高代码的灵活性。 - 可扩展性:允许在不修改原有类的基础上增加新的功能。 - 缺点: - 维护复杂性:继承可能导致类层次结构变得复杂,难以理解和维护。 - 过度使用:过度依赖继承可能导致设计过于耦合,不易改动。 - “钻石问题”:在C++中,多重继承可能导致二义性,需要谨慎处理。 - 抽象层次混淆:有时子类可能会对父类的方法进行不合适的覆盖,导致行为改变。 以上是关于C++内存管理及继承的一些关键知识点,这些内容对于理解和解答C++面试问题至关重要。