博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
free 与 delete
阅读量:6278 次
发布时间:2019-06-22

本文共 1517 字,大约阅读时间需要 5 分钟。

1. delete 用于释放 new 分配的空间,free 有用释放 malloc 分配的空间
2. delete [] 用于释放 new [] 分配的空间
3. delete 释放空间的时候会调用 相应对象的析构函数
     顺便说一下new在分配空间的时候同时会调用对象的构造函数,对对象进行初始化,使用malloc则只是分配内存
4. 调用free 之前需要检查 需要释放的指针是否为空,使用delete 释放内存则不需要检查指针是否为NULL
5. free 和 delete 不能混用,也就是说new 分配的内存空间最好不要使用使用free 来释放,malloc 分配的空间也不要使用 delete来释放
     举个例子,<string.h>里通常有个strdup函数,它得到一个char*字符串然后返回其拷贝:
     char * strdup(const char *ps); // 返回ps所指的拷贝
     在有些地方,c和c++用的是同一个strdup版本,所以函数内部是用malloc分配内存。这样的话,一些不知情的c++程序员会在调用strdup后忽视了必须对   strdup返回的指针进行free操作。为了防止这一情况,有些地方会专门为c++重写strdup,并在函数内部调用了new,这就要求其调用者记得最后delete。你可以想象,这会导致多么严重的移植性问题,因为代码中strdup以不同的形式在不同的地方之间颠来倒去。
 
补充一个问题,free和delete 是如何知道需要释放的内存块的大小的?
     
     在调用malloc或new 分配内存空间的时候,实际分配的空间会比程序员申请的空间要大。实际分配的内存空间前面有一部分空间用于保存所分配内存的大小,校验和等信息。当分配函数返回时,将会返回实际可操作的地址(也就是实际分配空间加上前面用于记录分配信息的空间之后的地址)。下面举个例子,例子通过破坏 new 返回地址的前面四个字节的数据导致内存空间释放出问题。如果不破坏前面的数据则不会出现内存不能释放的情况。
#include 
#include
#include
#include
#include
int main(){ int *p = NULL,*p1=NULL; int i; //p = (int *) malloc(10 * sizeof(int)); p = new int[10]; memset(p,0,sizeof(int) * 10); for(i=0;i<10;i++) printf("P:%d\t",p[i]); printf("addr p: %x\n",p); *(p-1) = 2; //如果不注释掉这一行则程序运行不正确 *(p+11) = 3; printf("addr before p: %x\n",p+11); printf("%x %x\n",*(p-1),*(p+11)); //free(p); delete [] p; printf("free successfully! \n"); return 0;}

当注释了*(p-1) = 2之后运行结果为:

当不注释*(p-1) =2 这一行时,结果为:

转载地址:http://skfva.baihongyu.com/

你可能感兴趣的文章
[置顶] ASP.NET环境的基本配置——VS2008+SQLEXPRESS+IIS5.1/IIS7.0
查看>>
Eclipse导入MyEclipse创建的WEB项目无法识别的解决方案
查看>>
MySQL:日期函数、时间函数总结
查看>>
公交线路查询接口文档
查看>>
restlet(javase版本) 的最基本使用
查看>>
Oracle优化学习
查看>>
布局之BFC
查看>>
峰Spring4学习(7)spring对JDBC的支持
查看>>
Log使用
查看>>
I - How many prime numbers
查看>>
两数之和---简单
查看>>
Linux文本处理三剑客之grep
查看>>
SQL Server 可疑的解决办法
查看>>
匿名函数
查看>>
大数加法
查看>>
python第二天
查看>>
Kaggle(一):房价预测
查看>>
Android开发历程_10(LayoutAnimationController的初步使用)
查看>>
apache https 伪静态
查看>>
FileUtil
查看>>