C++动态内存管理及其与C语言动态内存管理的差别

来源:互联网 发布:网络科学引论 pdf 编辑:程序博客网 时间:2024/05/16 15:51

在C语言中,我们常用malloc、calloc、realloc和free等函数来进行动态内存管理。

但是在C++中,我们则需要用到某些操作符进行动态内存管理。

new / delete —— 动态管理对象

new[] / delete[] —— 动态管理数组

▲new / delete 和 new[] / delete[] 一定要匹配使用!否则会内存泄漏!

void Test1(){int* p1 = new int;//创建一个int*类型指针,给指向的空间分配1个int大小的空间int* p2 = new int(10086);//创建一个int*类型指针,给指向的空间分配1个int大小的空间,并对其指向的空间进行初始化int* p3 = new int[2];//创建一个int*类型的指针,给指向的空间分配3个int大小的空间p3[0] = 1;p3[1] = 2;delete p1;//删除给p1所分配的空间delete p2;//删除给p2所分配的空间delete[] p3;//删除给p3所分配的空间}

对C语言有动态内存管理的人可能会有疑惑:明明C语言中已经有 malloc / free 函数进行动态内存管理了,C++又兼容C语言,那为什么我们还要使用 new / delete 和 new[] / delete[] 呢?

这要从 new / delete 背后的机制谈起了。


在使用new时,编译器进行两步操作:

1.调用 std::operator new() 函数进行分配内存(在 operator new 中调用了 malloc()函数)

2.调用被分配类型的构造函数

在使用delete时,编译器进行两步操作:

1.调用被分配类型的析构函数

2.调用 std::operator delete() 函数进行释放内存(在operator delete() 中调用了 free()函数)


在使用new[N]时,编译器进行两步操作:

1.调用 std::operator new() 函数进行分配内存(在 operator new 中调用了 malloc()函数)

2.调用N次被分配类型的构造函数

在使用delete[]时,编译器进行两步操作:

1.调用N次被分配类型的析构函数

2.调用 std::operator delete() 函数进行释放内存(在operator delete() 中调用了 free()函数)


整体来说,malloc() 在申请内存时候不会调用构造函数,free() 释放内存之后也不会调用析构函数,而 new / delete 进行申请 / 释放内存的时候则会调用,所以简单的说,在对c++内置类型进行动态内存管理的时候,使用 malloc() / free() 和 new / delete 的差别不大,但是在对用户自定义类型进行动态内存管理的时候,则必须使用 new / delete 或 new[] / delete[]。


在使用new时,编译器进行两步操作:

1.调用 std::operator new() 函数进行分配内存(在 operator new 中调用了 malloc()函数)

2.调用被分配类型的构造函数

在使用delete时,编译器进行两步操作:

1.调用被分配类型的析构函数

2.调用 std::operator delete() 函数进行释放内存(在operator delete() 中调用了 free()函数)