使用delete和delete[]的问题

mem0set 2011-06-12 09:35:24
class A;
...........

A* a = new A;
或者
A* a = new A[10];

要释放删除的时候我不知道前面用的是不是数组,应该怎么删除呢
...全文
206 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianya_unix 2011-06-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 supermegaboy 的回复:]
由于单对象的new和数组new对应不同的释放表达式,用同一个指针指向不同类型new的内存本身就是一个不良风格代码,你应该修改代码结构,用不同的指针释放不同类型的new,或者单对象new也使用数组形式,例如:

A *a = new A[ 1 ];
[/Quote]

delete [] a;

这样可以吧
5t4rk 2011-06-14
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 bjtbjt 的回复:]

你自己申请的
怎么不知道呢
要是不清楚或者容易忘你的话
你在定义指向数组时这样写吧,parr //用这个delete[] parr
你在定义一般时这样写吧,p //用这个delete p
呵呵,这样也可以的LZ
[/Quote]
5t4rk 2011-06-14
  • 打赏
  • 举报
回复
你自己申请的
怎么不知道呢
要是不清楚或者容易忘你的话
你在定义指针时这样写吧,parr //用这个delete[] parr
你在定义指针时这样写吧,p //用这个delete[] p
呵呵,这样也可以的LZ
zh_huo 2011-06-13
  • 打赏
  • 举报
回复
假如你分配内存的内型是内置型的话,那就不必考虑究竟用那个形式,但是如果分配内存的是自定义的话,必须用对应的形式,除非你的类中没有定义自己的析构函数。一下这篇文章你可以参考一下,写得很精彩http://www.chinaunix.net/jh/23/311058.html
fyw1990 2011-06-13
  • 打赏
  • 举报
回复
用deleted【】
赵4老师 2011-06-13
  • 打赏
  • 举报
回复
虎头蛇尾是俗人的习惯,
有始有终是君子的操守。
KevinHo 2011-06-13
  • 打赏
  • 举报
回复
delete是释放首地址
delete[]是释放一片连续的属于该指针指向的内存单元
iamsorry_ 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 mem0set 的回复:]
sizeof(a)
new和new[1]是样的吧
[/Quote]
是一样的。
mem0set 2011-06-13
  • 打赏
  • 举报
回复
sizeof(a)
new和new[1]是样的吧
飞天御剑流 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 mem0set 的回复:]
A* a = new A;
delete[] a;
这样会有什么后果
[/Quote]

这是未定义行为,后果取决于编译器的行为。
iamsorry_ 2011-06-13
  • 打赏
  • 举报
回复
删除之前先判断 对象a的大小sizeof(a)。根据不同的大小选择不同的释放方法。
mem0set 2011-06-13
  • 打赏
  • 举报
回复
A* a = new A;
delete[] a;
这样会有什么后果
飞天御剑流 2011-06-13
  • 打赏
  • 举报
回复
由于单对象的new和数组new对应不同的释放表达式,用同一个指针指向不同类型new的内存本身就是一个不良风格代码,你应该修改代码结构,用不同的指针释放不同类型的new,或者单对象new也使用数组形式,例如:

A *a = new A[ 1 ];
mem0set 2011-06-13
  • 打赏
  • 举报
回复
有没有办法在释放的时候检查出指针是不是数组
mem0set 2011-06-13
  • 打赏
  • 举报
回复
因为程序中有时候用new有时候用new[],最后在一个地方释放
LBJMD 2011-06-13
  • 打赏
  • 举报
回复
你自己定义的变量难道不知道类型吗?
Saingel 2011-06-13
  • 打赏
  • 举报
回复
deleted只会释放a[10]所占连续内存以及调用a[0]的析构函数,如果a内没有申请额外内存需要析构函数释放的话就没问题,如果有就会造成内存泄流,
加个[]操作时则会调用a[0]-a[9]析构函数
碎碎念 2011-06-13
  • 打赏
  • 举报
回复
这个怎么会不知道呢?如果忘记的话,直接选中指针a,然后查找a的定义就知道a指向的是数组还是单个对象了。
飞天御剑流 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 supermegaboy 的回复:]
引用楼主 mem0set 的回复:
class A;
...........

A* a = new A;
或者
A* a = new A[10];

要释放删除的时候我不知道前面用的是不是数组,应该怎么删除呢


这种情况都使用delete [] a;

delete [] a是能处理A *a = new A;这种情况的,这是标准所规定的行为。
[/Quote]

sorry,说错了,上面的delete [] a是未定义行为,还是得依照a的new的类型去delete。
W170532934 2011-06-12
  • 打赏
  • 举报
回复
自己定义的,难道你忘记了??该怎么删除就怎么删除吧,不然容易造成泄漏的哦
加载更多回复(5)

64,676

社区成员

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

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