C++动态内存管理:new、delete与malloc、free的区别
需积分: 10 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++面试问题至关重要。
2022-05-15 上传
2023-06-02 上传
2018-04-09 上传
2020-07-22 上传
2010-07-18 上传
2009-03-05 上传
2020-08-26 上传
richardcpp
- 粉丝: 0
- 资源: 2
最新资源
- 平尾装配工作平台运输支撑系统设计与应用
- MAX-MIN Ant System:用MATLAB解决旅行商问题
- Flutter状态管理新秀:sealed_flutter_bloc包整合seal_unions
- Pong²开源游戏:双人对战图形化的经典竞技体验
- jQuery spriteAnimator插件:创建精灵动画的利器
- 广播媒体对象传输方法与设备的技术分析
- MATLAB HDF5数据提取工具:深层结构化数据处理
- 适用于arm64的Valgrind交叉编译包发布
- 基于canvas和Java后端的小程序“飞翔的小鸟”完整示例
- 全面升级STM32F7 Discovery LCD BSP驱动程序
- React Router v4 入门教程与示例代码解析
- 下载OpenCV各版本安装包,全面覆盖2.4至4.5
- 手写笔画分割技术的新突破:智能分割方法与装置
- 基于Koplowitz & Bruckstein算法的MATLAB周长估计方法
- Modbus4j-3.0.3版本免费下载指南
- PoqetPresenter:Sharp Zaurus上的开源OpenOffice演示查看器