C++中动态内存管理

一、C语言中的动态内存管理

1. 堆空间(用户自己申请/管理/释放)

初次申请空间

void* malloc(size_t size):这里的参数size就是所需要申请内存空间的大小。
void* calloc(size_t num, size_t size):第一个参数num指要申请空间的个数,第二个参数size指单个空间的字节数。

当所申请的内存空间不足时,继续向内存申请空间来增容

void* realloc(void *memblock, size_t size):第一个参数memblock指要增容的空间的地址,第二个参数size指要增容到size个字节。

空间的释放

void free(void* memblock):参数memblock指要释放的空间的地址。

注意:堆上的内存需要用户自己来管理,动态malloc/calloc/realloc的空间,必须释放(free)掉,否则会造成内存泄露

2.栈空间(由编译器进行管理)

使用_alloca在栈上动态开辟内存,栈上开辟的内存由编译器自动维护,不需要用户显式释放

3.内存泄漏

●内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

内存漏露的检测方式

VS环境下,利用宏来检测内存泄漏:头文件 :crtdbg.h,将_crtdumpMemoryLeak()添加在工程的末尾。
VLD:第三方内存检测工具。


二、C++中的动态内存管理

在C++项目中,依然可以使用C语言中的内存管理方式,但是C++也有自己的动态内存管理方式。

1.通过new/delete;new[]/delete[]进行动态内存管理

int main()
{
    //动态分配4个字节(1个int)的空间单个数据
    int* p1 = new int;
    //动态分配4个字节(1个int)的空间并初始化为1
    int* p2 = new int(1);
    //动态分配12个字节(3个int)的空间
    int* p3 = new int[3];

    //delete/delete[]必须与new/new[]搭配使用
    delete p1;
    delete p2;
    delete[] p3;
    return 0;
}

●new和delete、new[]和delete[]一定匹配使用!!!!!!否则就会造成内存泄漏以及一些意想不到的结果。

2.malloc/free和new/delete的区别和联系

它们都是动态管理内存的入口。
malloc/free是C/C++标准库的函数,new/delete是C++操作符。
malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理(清理成员)。
malloc/free需要手动计算类型大小且返回值会void*,new/delete可自己计算类型的大小,返回对应类型的指针。

3.new/delete;new[]/delete[]的底层实现

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

4.定位new表达式

●定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象 。

new(地址) T(初始化列表);

new(地址) T;

猜你喜欢

转载自blog.csdn.net/h___q/article/details/81430853