堆上数组内存管理心得(new char[n]、delete、delete[]、指针、类对象数组)

4 篇文章 0 订阅
1 篇文章 0 订阅
char *pCh=new char[256];
    qDebug()<<"内容:"<<pCh<<endl;//输出T 内存没有清空,内容不可预测
    qDebug()<<"sizeof:"<<sizeof (pCh)<<endl;//输出4,不是数组长度256。因为指针变量只占用4个字节,
    qDebug()<<"strlen:"<<strlen(pCh)<<endl;//输出2,不是数组长度256或最长可存储合法字符数255。未清空,
    memset(pCh,'\0',256);
    qDebug()<<"清空后:"<<pCh<<endl;//无内容,数组已清空
    qDebug()<<"清空后sizeof:"<<sizeof (pCh)<<endl;//输出4,不是数组长度256。因为指针变量只占用4个字节,
    qDebug()<<"清空后strlen:"<<strlen(pCh)<<endl;//输出0。数组已经清空
 
    memset(pCh,'a',254);//前254字符设置为'a'
 
    qDebug()<<"前254字符设置为'a':"<<pCh<<endl;//结果为254个a
    qDebug()<<"前254字符设置为'a'后sizeof:"<<sizeof (pCh)<<endl;//
    qDebug()<<"前254字符设置为'a'后strlen:"<<strlen(pCh)<<endl;
 
    /*
    memset(pCh,'b',260);//前254字符设置为'b',程序异常终止
    qDebug()<<"前260字符设置为'b',数据溢出:"<<pCh<<endl;
   qDebug()<<"前260字符设置为'b',数据溢出 sizeof:"<<sizeof(pCh)<<endl;
   qDebug()<<"前260字符设置为'b',数据溢出 strlen:"<<strlen(pCh)<<endl;
   */
 
    char *p1=pCh;
    char *p2=pCh;
 
    //正常修改堆上数组内容
    *p1='b';
    qDebug()<<"内容:"<<pCh<<endl;//输出baa...
    *(p1+1)='c';
    qDebug()<<"内容:"<<pCh<<endl;//输出bca...
    p1++;
    p1++;
    *p1='d';
    qDebug()<<"内容:"<<pCh<<endl;//输出bcda...
 
    //释放内存 后,该块内存,依然可以正常访问,甚至修改
 
    delete pCh;//
 
    qDebug()<<"pCh内容:"<<pCh<<endl;//输出bcda...
    qDebug()<<"p1内容:"<<p1<<endl;//输出da...
    qDebug()<<"p2内容:"<<p2<<endl;//输出bcda...
    *pCh='x';
    qDebug()<<"pCh内容:"<<pCh<<endl;//输出da...
 
 
    delete[] pCh;
    qDebug()<<"pCh内容:"<<pCh<<endl;//输出bcda...
    qDebug()<<"p1内容:"<<p1<<endl;//输出da...
    qDebug()<<"p2内容:"<<p2<<endl;//输出bcda...
    *pCh='x';
    qDebug()<<"pCh内容:"<<pCh<<endl;//输出da...
 
    //释放内存后,一定记住要将指针设置为NULL
    delete[] pCh;
    pCh=NULL;
 
 
    //对于简单类型(int char long float double)数组,delete与delete[]效果一致
 
    //但是对于类对象数组,delete和delete[]效果不一致
    //delete仅仅释放了类对象数组第一个对象的内存,而delete[]会依次释放类对象数组的全部对象
    class aClass
    {
    public:
        void test(){
            qDebug()<<"测试"<<endl;
        }
 
     aClass()
     {
         p=new char[12];
         qDebug()<<"堆上分配内存"<<endl;
 
     }
 
     ~aClass()
     {
         delete[] p;
         qDebug()<<"堆上释放内存"<<endl;
 
     }
    private:
     char *p;
 
    };
 
    aClass* pClassArray1=new aClass[8];
 
    qDebug()<<"使用delete释放类对象数组:"<<endl;
    delete pClassArray1;//只调用了第一个对象的析构函数
 
    pClassArray1->test();//依然可正常访问
    (pClassArray1+1)->test();//依然可正常访问
 
 
    aClass* pClassArray2=new aClass[8];
 
    qDebug()<<"使用delete[]释放类对象数组:"<<endl;
    delete[] pClassArray2;//依次调用了类对象数组所有对象的析构函数
 
    pClassArray2->test();//依然可正常访问
    (pClassArray2+1)->test();//依然可正常访问
 
 
    //正确的类对象数组释放方式
    aClass* pClassArray3=new aClass[8];
    //使用...
 
    delete[] pClassArray3;
    pClassArray3=NULL;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值