美文网首页
delete free

delete free

作者: hehehehe | 来源:发表于2020-10-19 12:42 被阅读0次
    https://www.cnblogs.com/gatherstars/p/8179859.html
    1. 数组的时候int *p=(int*)malloc(10*sizeof(int)) 释放的时候 free(p)即可;
    这是因为编译器对malloc做了一些特殊的处理,以保证可以正确释放内存。
    而当int *p=new int[10]释放的时候应为delete []p,注意[]的作用说明释放的是一个数组的内存,
    如果delete p则只是释放的p[0],其余9个int的内存没有释放;这是因为当指明为[]的时候,
    编译器实际上是做了一个循环来释放这个数组的所有内存。
    
    2. 在类和对象的时候会有很大区别。在使用malloc和free来处理动态内存的时候,仅仅是释放了这个对象所占的内存,而不会调用这个对象的析构函数;使用new和delete就可以既释放对象的内存的同时,调用这个对象的析构函数。
    
    https://www.cnblogs.com/wangpfcnblogs/p/4604311.html
    一,new和delete:
    
    (1)new是操作符,不是函数,malloc是函数。
    
    (2)基本数据类型(int ,float,double,char),free, malloc, new,delete 效果一致。
    
    (3)delete ,free对于基本数据类型,释放,释放两次都会出错。
    
    (4)free之后,指针的值不会改变,delete之后,指针的值会改变(我的电脑上每次delete之后,指针的值变成了0000 8123),
    而free之后的指针的值没有改变,打印出来的是垃圾值。free之后,为了避免迷途指针,
    最好将指针设置为空指针(nullptr)。
    
    (5)如果是基本数据类型 new 是不会调用构造函数,delete 时不会调用析构函数。
    
    如果是结构类型,new会调用构造函数,delete会调用析构函数。
    
    (6)基本数据类型 数组,delete,delete[]一致;基本数据类型,可以互相混合使用。
    
    (7)复合数据类型(delete  ,delete[]不能混合使用)
    
    例如:mydata *p(new mydata);   delete p;
    
    mydata *p(new mydata[10]);    delete[] p;
    
    (8)单个堆上的对象,不可以用delete [],反复delete,下面delet代码是错误,只用能delete p,不能用delete [] p.
    
    mydata *p(new mydata);
    
    delete [ ]  p;//单个堆上的对象,不可以用 delete [],用delete[]程序会报错
    
    #include<iostream>
    using namespace std;
    
    void main2()
    {
        int *p1 = new int(4);//指向一个变量
        int *p2 = new int[10]{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };//指向数组
        delete p1;//delete p1    int *p1 = new int(4);
        delete[] p2;//delete[] p2  int *p2 = new int[10]{ 1,2,3,4,5,6,7,8,9,0 };
        
        cin.get();
    }
    

    相关文章

      网友评论

          本文标题:delete free

          本文链接:https://www.haomeiwen.com/subject/qsykmktx.html