C动态内存管理好难怎么办零基础图文讲解小白轻松理解原理

21次阅读

共计 2019 个字符,预计需要花费 6 分钟才能阅读完成。

首先我们先了解一下内存:

C 语言使用 malloc/free 动态管理内存空间,C++ 引入了 new/delete,new[]/delete[]来动态管理内存。

介绍 new/delete,new[]/delete[]之前我们先了解一下 operator new,operator delete,operator new[],operator delete[]函数。

注:这些函数并没有重载 new/delete 表达式。
最后,如果大家如果在自学遇到困难,想找一个 C ++ 的学习环境,可以加入我们的 C ++ 学习圈,点击我加入吧,会节约很多时间,减少很多在学习中遇到的难题。


函数声明如下:

void* operator new(size_t size);

void operator delete(size_t size);

void* operator new[](size_t size);

void operator delete[](size_t size);

析:operator new/operator delete,operator new[]/operator delete[]是标准库函数,用法和 malloc/free 的用法一样,只负责分配 / 释放空间,但实际上 operator new/operator delete 只是 malloc/free 的一层封装。

new/delete:动态管理对象;

new[]/delete[]动态管理对象数组。

int* ptr1=new int;// 动态分配 4 个字节的空间

delete ptr;

int* ptr2=new int(4);// 动态内存分配 4 个字节空间并初始化

delete ptr2;

int* ptr3=new int[4];// 动态内存分配 16 个字节空间

delete[];

1>,new/delete 实际上做了什么事呢??

new:先调用 operator new 分配空间,再调用构造函数初始化空间。

delete:先调用析构函数清理对象,再调用 operator delete 释放空间。

2>,new[]/delete[]实际上做了什么事呢??

new[n]:调用 operator new 分配空间,再调用 n 次构造函数初始化对象。

delete[n]:调用 n 次析构函数清理对象,再调用 operator delete 释放空间。


为什么编译器会知道调用多少次构造函数,析构函数呢?

原来在 new[]分配空间的时候会在头部多分配 4 个字节来存 n,这样在调用 new[]/delete[]时就知道调用几次构造函数和析构函数了。

new/delete,new[]/delete[]为什么要成对出现?

当 new 在开辟内置类型的空间时,不成对出现是可以的;但是当开辟非内置类型空间时,就要多开辟 4 个字节,这时如果不成对使用就会造成内存泄漏或者程序崩溃。


用宏模拟实现 new[]/delete[]申请和释放数组

//DELETE_ARRAY 参数中传 n

define NEW_ARRAY(ptr,type,n)

do{

ptr=(type)operatornew(sizeof(type)n);

for (size_t i = 0; i <n;++i)

{

new(ptr+i)type;

}

} while (0);

define DELETE_ARRAY(ptr,type,n)

do{

for (size_t i = 0; i < n; ++i)

{

(ptr+i)->~String();

}

operator delete ptr;

} while (0);

C++ 动态内存管理好难怎么办?零基础图文讲解,小白轻松理解原理
// 给 DELETE_ARRAY 中不传 n

define NEW_ARRAY(ptr,type,n)

do{

ptr = (type)operator new(sizeof(type)n + 4); // 给 n 也分配空间

(int)ptr = n;

ptr=(type)((char)ptr+4);

for (size_t i = 0; i < n; ++i)

{

new(ptr + i)(type);

}

} while (0);

define DELETE_ARRAY(ptr,type)

do{

size_t n = ((int)ptr – 1);

for (size_t i = 0; i < n; ++i)

{

(ptr + i)->~String();

}

operator delete(char*(ptr – 4));

} while (0);

malloc/free 和 new/delete 之间关系和差异

C++ 动态内存管理好难怎么办?零基础图文讲解,小白轻松理解原理
关系:都能进行动态内存管理。

差异:1>,malloc/free 是标准的库函数,new/delete 是操作符;

2>,malloc/free 只是分配 / 释放内存,new/delete 不仅分配 / 释放内存还调用构造函数初始化和析构函数清理;

3>,malloc/free 手动计算类型大小,返回值 void*,new/delete 自动计算类型大小,返回对应类型的指针;

4>,malloc/free 失败返回 0,new/delete 失败抛异常。

正文完
 0