free 与 delete

本文详细解释了C++中new/delete与malloc/free的区别及使用注意事项,包括它们如何分配和释放内存,以及不当使用可能导致的问题。

原文地址:http://www.cnblogs.com/zhuyp1015/archive/2012/07/20/2601698.html

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<stdio.h>
#include <new>
#include<iostream>
#include<stdlib.h>
#include <string.h>
 
int main()
{
    int *p = NULL,*p1=NULL;
    int i;
    //p = (int *) malloc(10 * sizeof(int));
    p = newint[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");
    return0;
}

 

 

 

 

 

 

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值