自定义类使用delete[]时候出错

emyueguang 2011-03-03 02:40:25
有一个问题,关于delete运算符的调用,先看一个类的定义
class Int
{
public:
Int(){};
Int(Int& value){}
Int(int value){}
~Int(){};

};

这是我自己定义的一个类,中间先不实现任何的东西。
//Demo 3.
Int* pInt = new Int(10);
//delete[] pInt; //带[]的使用delete会出bug
delete pInt;

int* pi = new int(10);
delete[] pi; //这个就不会出bug

我使用的开发工具是VS2010,请教下,为什么我自定义的类就出现不可以使用delete[]来释放内存空间?而内置的类型就可以(在定义的不是数组的基础上调用delete[],如果是定义的Int* pArr = new Int[10], 调用delete[] pArr是没有错误的)


请问我自定义的类应该添加一些什么处理,就可以使
Int* pInt = new Int(10);
delete[] pInt; //带[]的使用delete会出bug
不会出错?
...全文
212 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
emyueguang 2011-03-04
  • 打赏
  • 举报
回复
一个小问题~~~,如此劳师动众~~,辛苦大家了,我明白了~~~
fulima007 2011-03-03
  • 打赏
  • 举报
回复
string *stringptr1 = new string;
string *stringptr2 = new string[100];

...

delete stringptr1;// 删除一个对象
delete [] stringptr2;// 删除对象数组
xdwk281 2011-03-03
  • 打赏
  • 举报
回复
C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。
关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。

对于 (1),上面提供的程序已经证明了 delete[] 和 delete 是等同的。但是对于 (2),情况就发生了变化。请看下面的程序。

#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 p1 和 delete[] p1 的不同结果,我就不在这里贴运行结果了。

从运行结果中我们可以看出,delete p1 在回收空间的过程中,只有 p1[0] 这个对象调用了析构函数,其它对象如 p1[1]、p1[2] 等都没有调用自身的析构函数,这就是问题的症结所在。如果用 delete[],则在回收空间之前所有对象都会首先调用自己的析构函数。

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

所以一个简单的使用原则就是:new 和 delete、new[] 和 delete[] 对应使用。

云悠然 2011-03-03
  • 打赏
  • 举报
回复
用()是直接赋一值,用[]才是一个数组,才能用delete[]
QQIANQQ 2011-03-03
  • 打赏
  • 举报
回复
new 和delete
new[]和 delete[] 是要搭配使用的。不能乱搭!
mcd_23 2011-03-03
  • 打赏
  • 举报
回复
看下 effective C++
条款5:对应的new和delete要采用相同的形式
wei801516 2011-03-03
  • 打赏
  • 举报
回复
都被你们说掉咯 没的说咯。。。。。
fengzhw 2011-03-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 direction917 的回复:]

int* pi = new int(10); //...................这个是数组
delete[] pi; //这个就不会出bug

Int* pInt = new Int(10);//....................这个是类的对象的指针,指向一个新生成的对象。
delete[] pInt; //带[]的使用delete会出bug
[/Quote]
不带这么坑人的啊。new的时候,()和[]完全是两个意义,只有[]能代表数据
direction917 2011-03-03
  • 打赏
  • 举报
回复
int* pi = new int(10); //...................这个是数组
delete[] pi; //这个就不会出bug

Int* pInt = new Int(10);//....................这个是类的对象的指针,指向一个新生成的对象。
delete[] pInt; //带[]的使用delete会出bug
路人丁 2011-03-03
  • 打赏
  • 举报
回复
Int *p = new Int[]
delete[] p;

Int *p = new Int
delete p;

注意你的 new Int(); 括号内只是个构造传入参数,可不是new出来的数组长
yuyan_linger 2011-03-03
  • 打赏
  • 举报
回复
不要想办法让错误的使用表现出正确的结果
这样等使用的时候会自己把自己绕晕的
bdmh 2011-03-03
  • 打赏
  • 举报
回复
Int* pInt,使用delete
Int* pInt[],使用delete[]

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧