前言:
本教程旨在提取最精炼、实用的C++面试知识点,供读者快速学习及本人查阅复习所用。本文配套《C++面试宝典》已整理,免费领取地址:https://pan.quark.cn/s/c991f40d40a7
- 一、new、delete、malloc、free之间的关系
-
- 1.核心关系与区别
特性 new/delete malloc/free
语言归属 C++ C语言/C++
内存分配类型 对象(含构造函数调用) 原始内存块(不调用构造函数)
内存释放类型 对象(含析构函数调用) 原始内存块(不调用析构函数)
参数类型 自动推导大小 需要指定内存大小(size_t)
- 1.核心关系与区别
-
- 2.new与delete(C++对象管理)
new:
多态分配对象内存,并调用对象的构造函数
语法:
指针=new类型;或指针=new类型(构造参数);
示例:
- 2.new与delete(C++对象管理)
#include <iostream>class MyClass {public:
MyClass() { std::cout << "构造函数调用\n"; }
~MyClass() { std::cout << "析构函数调用\n"; }
};
int main() {
MyClass* obj = new MyClass(); // 分配内存并调用构造函数
delete obj; // 释放内存并调用析构函数
return 0;
}
输出结果:
构造函数调用
析构函数调用
delete:
释放new分配的对象内存,并调用对象的析构函数
注意:若忘记调用delete,会导致内存泄漏
-
- 3.malloc与free(原始内存管理)
malloc:
分配指定大小的原始内存块,不调用构造函数
语法:指针=(类型*)malloc(字节数);
- 3.malloc与free(原始内存管理)
#include <iostream>#include <cstdlib> // 包含malloc/free
class MyClass {public:
MyClass() { std::cout << "构造函数调用\n"; }
~MyClass() { std::cout << "析构函数调用\n"; }
};
int main() {
MyClass* obj = (MyClass*)malloc(sizeof(MyClass)); // 仅分配内存
free(obj); // 仅释放内存,不调用析构函数
return 0;
}
输出:(无输出,因为不调用构造跟析构函数)
free:
释放malloc分配的内存,不会调用析构函数
风险:若对象包含资源(如文件句柄、动态数组),未调用析构函数会导致资源泄漏
-
- 4.注意事项
4.1构造函数与析构函数
new/delete会调用构造函数与析构函数
malloc/free仅管理内存,不涉及对象生命周期
4.2类型安全
new自动推导类型大小,无需计算
malloc要手动指定字节数
4.3
C++中优先使用new/delete
避免混用new/malloc和delete/free
- 4.注意事项