new/delete和malloc/free异同
来源:互联网 发布:万达电商 淘宝卖货 编辑:程序博客网 时间:2024/06/05 13:33
在C++中当我们不清楚将要使用的内存空间参数(size == n)时,比如在一个函数intFibonacci(const int n){} 中,如果使用空间换时间的方法,我们将要分配一个整型指针数组int *temp, 但是,这个数组的大小该是多少就是不确定的。在C语言里使用的是int * temp = (int *) malloc (sizeof(int) * n); 而最后需要将所申请的内存释放掉,即:free(temp); 在C++中使用 int * temp = new int[n]; ... delete [] temp; 而这两者的异同是什么呢?我最初也不是很清楚,所以在各大论坛搜了下,发现的确有很多以前经常用的但是不知所以然的地方,这里把他们梳理出来给大家分享。
(一) 申请和释放:
i. int * a = new int(10); 与 int * a = new int[10];
// *a = 10; // a 数组头指针,数组大小为10
ii. int * a = new int[M * N]; 与 int **a = new int[M][N];
均可以用于申请二维数组,第一个是用一维数组表示二维数组,但是用起来有木有很灵活的赶脚儿~
iii. delete
delete a; // 释放 整型指针 a
delete [] a; // 释放 整型一维数组指针 a
for (int i = 0; i < M; ++i) {
delete [] a[i]; // 释放 整型二维数组指针 a
}
(二) new / delete and malloc / free 异同:
1.1. new/delete是C++里才有的,而new/delete与malloc/free一个显著的区别在于,new是建造一个对象,并调用对象的构造函数来初始化对象,其实在所有的new操作过程中,总是分为两步的:第一步是申请内存,第二步则是调用构造函数初始化对象。同样,在调用delete的时候,需要先调用析构函数,然后在销毁堆内存。
1.2. new/delete通常来说是操作符,就是"+","-"一样。1.3. new/delete是可以重载的,而重载之后,就成为了函数。
1.4. malloc在申请内存的时候,必须要提供申请的长度,而返回的指针是void*型,必须要强转才能成为需要的类型。
1.5. 当new/delete在类中被重载的时候,可以自定义申请过程,比如记录所申请内存的总长度,以及跟踪每个对象的指针。
1.6. C++默认的new/delete操作符内部,其实也调用了malloc/free这两个函数。
2.1. 都必须配对使用,这里的配对使用,可不能理解为一个new/malloc就对应一个delete/free,而是指在作用域内,new/malloc所申请的内存,必须被有效释放,否则将会导致内存泄露,至于内存泄露的检查方法,我们推荐的工具是大家众所周知的BoundsChecker,至于如何使用BoundsChecker,我们将在以后撰文详解。
2.2. 都是申请内存,释放内存,free和delete可以释放NULL指针。
new/delete与malloc/free不能混合使用,有些人对这个观点持怀疑态度,因为在很多时候,他混合使用之后也没有严重的后遗症,那是因为在通常情况下,new操作符的确调用了malloc这个函数,所以free函数可以正常的释放new出来的内存空间。但这并不能保证所有的new操作符都是调用C++的new的原始操作符,而最常见的是,在类中,我们是可以重载new这个操作符的,这样的话,如果一但在operator=new()函数中调用了其它的申请函数的话东西,free将无法正常工作,或者说也将导致内存泄露。
- new/delete和malloc/free异同
- malloc/free new/delete 的异同点
- malloc/free与new/delete异同点
- new/delete与malloc/free的异同
- malloc/free和new/delete
- new/delete 和 malloc/free
- malloc free 和new delete
- malloc/free和new/delete
- malloc/free 和 new/delete
- malloc/free和new/delete
- new/delete和malloc/free
- malloc/free和new/delete
- new、delete和malloc、free
- malloc-free和new-delete
- new/delete和malloc/free
- malloc/free和new/delete
- malloc()、free()和new、delete
- new,delete和malloc,free
- 查看RenderObject树的内部表示
- as…as 结构用法详解
- Debug your ASP.NET Application while Hosted on IIS
- memory dump analysis anthology volume 7 online
- Consecutive Numbers
- new/delete和malloc/free异同
- HTML+CSS基础知识整理总结2015.3.10
- 【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 & 第一个Shader的书写
- C++字符串操作整理
- leetcode--Validate Binary Search Tree
- 1008. Elevator
- 【2013-5】 day2 一系列生成树问题
- mongodb 详解 error:10061 由于目标计算机积极拒绝,无法连接
- ORACLE 内置函数之 GREATEST 和 LEAST