hello~ 很高兴见到大家! 这次带来的是C++中关于内存管理这部分的一些知识点,如果对你有所帮助的话,可否留下你的三连呢? 个 人 主 页: 默|笙

c++与c语言的内存分布差不多,如下图:

引入:c语言是通过 malloc、calloc、realloc、free来实现动态内存分配的。而C++在保留C风格内存管理的同时,引入了面向对象特性和更安全的动态内存管理机制 new 与 delete操作符,显著提升了代码的安全性和便捷性。

未初始化的动态内存:
显式初始化中动态数组的初始化:
自动调用:不传参数,自动调用默认构造函数。 显式调用:无论构造函数的参数个数,都会通过创建匿名对象显式/隐式调用构造函数:
class MyClass
{
public:
MyClass(int a = 1, int b = 1)
{
_a = a;
_b = b;
}
private:
int _a = 0;
int _b = 0;
};
int main()
{
MyClass* arr1 = new MyClass[3]; // 为每个元素调用默认构造函数
MyClass* arr2 = new MyClass[3]{}; // 同上(显式值初始化)
//显式匿名对象
MyClass* arr3 = new MyClass[3]{ MyClass(1, 2), MyClass(2, 3) }; // 前两个显式调用构造函数,第三个默认构造
//隐式匿名对象
MyClass* arr4 = new MyClass[3]{ {1, 2}, {2, 3} };
//前两个隐式调用构造函数,第三个默认构造
//这里还有编译器的优化,构造+ 拷贝构造优化为直接构造
return 0;
}delete 指针名;
delete[] 指针名;
指针名 = nullptr;对于内置类型:只用释放内存,没有析构函数可调用。 对于自定义类型:先调用析构函数,而后释放内存。
//通过malloc来申请空间
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{
// try to allocate size bytes
void *p;
while ((p = malloc(size)) == 0)
if (_callnewh(size) == 0)
{
// report no memory
// 如果申请内存失败了,这里会抛出bad_alloc 类型异常
static const std::bad_alloc nomem;
_RAISE(nomem);
}
return (p);
}
/*
operator delete: 该函数最终是通过free来释放空间的
*/
void operator delete(void *pUserData)
{
_CrtMemBlockHeader * pHead;
RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
if (pUserData == NULL)
return;
_mlock(_HEAP_LOCK); /* block other threads */
__TRY
/* get a pointer to memory block header */
pHead = pHdr(pUserData);
/* verify block type */
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
_free_dbg( pUserData, pHead->nBlockUse );
__FINALLY
_munlock(_HEAP_LOCK); /* release other threads */
__END_TRY_FINALLY
return;
}1.内置类型
如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是: new/delete申请和释放的是单个元素的空间,new[ ]和delete[ ]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。
2.自定义类型
MyClass* obj = new MyClass(); // 分配单个对象
delete[] obj; // 错误!可能重复调用析构函数(未定义行为),可能导致程序崩溃。后果:若 MyClass 的析构函数释放资源,重复调用会导致资源破坏。
MyClass* arr = new MyClass[3]; // 分配数组
delete arr; // 错误!仅调用第1个元素的析构函数,剩余元素内存泄漏后果:仅释放数组首元素,剩余对象的析构函数未被调用,导致资源泄漏。
原因:

特性 | malloc/free | new/delete |
|---|---|---|
内存分配本质 | 标准库函数(stdlib.h) | 语言内置操作符(C++ 特性) |
类型转换 | 返回 void*,需手动转换为目标类型 | 自动推导类型,返回目标指针(如 int*) |
构造 / 析构 | 不调用构造函数和析构函数 | 自动调用构造函数(new)和析构函数(delete) |
内存分配失败处理 | 返回 NULL,需手动检查 | 抛出 std::bad_alloc 异常(可通过 std::nothrow 禁用) |
数组支持 | 需手动计算数组大小(如 malloc(n * sizeof(int))) | 直接支持 new[] 和 delete[],自动管理数组长度 |
资源管理 | 仅管理内存,不处理其他资源 | 通过构造 / 析构函数自动管理对象生命周期内的所有资源 |
今天的分享就到此结束啦,如果对读者朋友们有所帮助的话,可否留下宝贵的三连呢~~ 如果可以, 那就让我们共同努力, 一起走下去!