c++delete与delete[]的基础区别小示例

5 篇文章 0 订阅
本文详细讲解了C++中delete和delete[]在内存管理上的差异,涉及基本类型和对象数组的内存释放,以及对应示例代码和运行结果。特别关注了对象数组使用delete时只释放首元素的问题,与delete[]的完全释放对比。
摘要由CSDN通过智能技术生成

简单区别

共性

delete仅删除指针指向的地址的空间,并不删除指针的原有空间

对于基础类型

1、delete可以正确的释放new出来的内存空间;
2、delete[]删除一个常规数组时与delete作用一样仅能删除首元素;

对于对象数组类型

1、delete仅能删除首元素,删除对象数组时,delete仅调用数组首对象析构函数,剩余对象空间无法
被释放,delete[]则可以释放指针指向的全部空间;

源代码

#include<iostream>
using namespace std;

#define ARRAY_SIZE 6

class Test
{
    public:
        Test(int m = 20) { member = m;}
        ~Test() {cout<<"Delete object."<<endl;}
        void setVal(int num) {member = num;}
        void show() {cout<<"num=: "<<member<<endl;}
    private:
        int member;
};

// 1、delete仅删除指针指向的地址的空间,并不删除指针的原有空间
void ordinaryDelete();  
/* 2、delete[]删除一个常规数组时与delete作用一样,仅能删除首元素,删除对象数组时,
delete仅调用数组首对象析构函数,剩余对象空间无法被释放,delete[]则可以释放指针指
向的全部空间*/
void objDelete();


int main()
{
    ordinaryDelete();

    objDelete();

    return 0;
}

void ordinaryDelete()
{
    cout<<"Before\n";
    int *pInt = new int;
    *pInt = 10;       
    cout<<*pInt<<'\n';   
    delete pInt;

    cout<<"Test again"<<endl;
    pInt =new int;
    *pInt = 666;	   
    cout<<*pInt<<endl;
    delete pInt;
}


void objDelete()
{
    // 普通类型
    double *Parr = new double[ARRAY_SIZE]();    //初始化每个值为0
    for (int i = 0; i < ARRAY_SIZE; i++) {
        Parr[i] += 3.14;
        cout<<"Parr "<<i<<" is: "<<Parr[i]<<"\t";
    }
    cout<<endl;

    cout<<"普通类型delete"<<endl;
    #if 0
    //    delete Parr;    
    #endif
    #if 1
    delete [] Parr; // 两者效果一样,仅能删除首元素
    #endif
    for (int j = 0; j < ARRAY_SIZE; j++) {
        cout<<"Parr "<<j<<" is: "<<Parr[j]<<"\t";    
    }
    cout<<endl;

    // 对象类型
    cout<<"对象类型"<<endl;
    Test *Pobj = new Test[ARRAY_SIZE];
    for (int i = 0; i < ARRAY_SIZE; i++) {
        cout<<"objInit "<<i<<" is: ";
        Pobj[i].setVal(1000); 
        Pobj[i].show();
    }
    
    cout<<"对象类型delete"<<endl;
#if 1
    delete Pobj; // delete仅调用数组首对象的析够函数
#endif
#if 0
    delete[] Pobj; // delete[]正确删除对象数组中每个成员的对象空间
#endif
}

运行截图

对象数组使用delete

在这里插入图片描述

对象数组使用delete[ ]

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值