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()函数)
- C++动态内存管理及其与C语言动态内存管理的差别
- C语言动态内存管理
- C语言动态内存管理
- C语言动态内存管理
- C语言动态内存管理
- c的动态内存管理
- c的动态内存管理
- 【C++】动态内存管理
- 【C++】动态内存管理
- 【C++】动态内存管理
- C语言内存管理(初级)----动态数组
- c语言中的动态内存管理
- C语言 内存动态管理函数
- c指针 c的动态内存管理
- C语言内存的动态存储管理1-概述
- C/C++动态内存管理
- 【C++】C++动态内存管理
- C/C++动态内存管理
- java中路径关于/和.的使用
- Facenet初探
- RuntimeError: invalid argument 4: out of range at pytorch/torch/lib/TH/generic/THTensor.c:439
- 清除浮动三种方式:
- 深度学习: CNN经典网络模型
- C++动态内存管理及其与C语言动态内存管理的差别
- mongodb role类型
- ASP,PHP,JSP,ASP.NET 比较
- 两个div,一个固定宽度和一个自适应宽度
- android Gridview item高度适应行最大高度问题
- springBoot(七)整合之整合spring Security理解
- Python爬虫之下载媒体文件
- 阿里宣布五年拿100亿投入脱贫基金;宝马共享汽车落地中国 ;美国监管当局允许比特币期货交易丨价值早报
- 人工智能商业化的元年,七大产业谋求变革,你最看好谁