zoukankan      html  css  js  c++  java
  • free 与 delete

    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 = 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 这一行时,结果为:

  • 相关阅读:
    在Centos 7下编译openwrt+njit-client
    开博随笔
    Chapter 6. Statements
    Chapter 4. Arrays and Pointers
    Chapter 3. Library Types
    Chapter 2.  Variables and Basic Types
    关于stm32不常用的中断,如何添加, 比如timer10 timer11等
    keil 报错 expected an identifier
    案例分析 串口的地不要接到电源上 会烧掉
    案例分析 CAN OPEN 调试记录 进度
  • 原文地址:https://www.cnblogs.com/zhuyp1015/p/2601698.html
Copyright © 2011-2022 走看看