C++ 中delete p 和delete [] p的区别

在看面试宝典的时候 ,书上有一段程序写下来一堆错误,google下 是delete 和delete []的区别

首先看一下错误代码和错误结果:

#include <stdio.h>


class CTest
{
public:
    ~CTest()
    {
        printf("~CTest dtor\n");
    }
};
int main()
{

    CTest  *p = new CTest[10];
    printf("%d\n" ,*((int *)p-1));
    delete p;
    return 0;
}

错误结果:


可以看到 ,这里调用了一次析构函数,打印输出了一次,剩下的是一堆错误(如果指针错误的话 经常会遇到这种问题,内容具体是什么搞不懂)


delete 与 delete [] 的区别:

  operator new 和 operator delete函数有两个重载版本,每个版本支持相关的new表达式和delete表达式:

   void* operator new (size_t);        // allocate an object
   void* operator new [] (size_t);     // allocate an array
  
   void operator delete (void*);       // free an oject
   void operator delete [] (void*);    // free an array

C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。
用new的时候会发生两件事。首先,内存被分配,然后,为被分配的内存调用一个或多个构造函数。用delete的时候,也有两件事发生:首先,为将被释放 的内存调用一个或多个析构函数,然后,释放内存。对于 delete来说会有这样一个重要的问题:内存中有多少个对象要被删除?答案决定了将有多少个析构函数会被调用。 

关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。 

基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。

测试代码:
#include <iostream>;

using namespace std;



class T {

public:

  T() { cout << "constructor" << endl; }

  ~T() { cout << "destructor" << endl; }

};



int main()

{

  const int NUM = 3;



  T* p1 = new T[NUM];

  cout << hex << p1 << endl;

  //  delete[] p1;

  delete p1;



  T* p2 = new T[NUM];

  cout << p2 << endl;

  delete[] p2;

}

对于 构造了析构函数的 类,我们删除的时候只能delete[]
运行结果:





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值