c++---内存问题---delete p和delete[]p 区别

来源:互联网 发布:网络端口怎么拆下来 编辑:程序博客网 时间:2024/06/04 18:32
void test()
{
    char*p1 = NULL;
    char*p2 = NULL;
    
    p1 = new char;
    printf("p1 = %p\n",p1);
    delete p1;
    printf("p1 = %p\n",p1);
    p2 =     new char;
    printf("p2 = %p\n",p2);
}

运行结果

p1 = 0x82f7008
p1 = 0x82f7008
p2 = 0x82f7008

分析

地址没有变化



class AA
{
    public:
        AA(){printf("aa\n");}
        ~AA(){printf("~aa\n");}
    private:
        int a;

};

void test3()
{
    AA *p = NULL;
    p = new AA[10];
    
    // eroor delete p;
    delete []p;
}



void test2()
{
    char *p = new char[10];
    //delete p; //right
    delete []p;
}

运行结果

aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
~aa
~aa
~aa
~aa
~aa
~aa
~aa
~aa
~aa
~aa


class A
{
    private:    
        int i;
        string s;
    public:
        ~A(){printf("~a\n");}
};


void d(A* p)
{
    delete []p;
    //delete p; //error
}


void test1()
{
    A *p = new A[10];
    d(p);
    
}



int main()
{
    test();
    return 0;

}


结论

基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;

但是对于类对象数组,只能用 delete[]。

对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。


delete []objects; // 正确的用法
delete objects;  // 错误的用法
后者相当于delete objects[0],漏掉了另外99 个对象
严格应该这样说:后者相当于仅调用了objects[0]的析构函数,漏掉了调用另外99 个对象的析构函数,并且在调用之后释放内存时导致异常

(如果存在析构函数的话),如果对象无析构函数该语句与delete []objects相同




原创粉丝点击