动态数组stripes[]为什么必须:delete [] stripes; 而下面的代码,程序结束后会弹出警告?

ga6840 2009-07-16 01:42:49
动态数组stripes[]为什么必须:delete [] stripes; 而下面的代码,程序结束后会弹出警告?


for(int buff=0;buff < width ;buff++)
{
delete (stripes+buff);
}


大家幸苦了!
...全文
50 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ga6840 2009-07-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 steedhorse 的回复:]
stripes+buff所指向的那个元素,只是动态申请的stripes数组的一部分,它不可以从整个数组中被拎出来单独释放。
[/Quote]

十分感谢!
ga6840 2009-07-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 steedhorse 的回复:]
stripes+buff所指向的那个元素,只是动态申请的stripes数组的一部分,它不可以从整个数组中被拎出来单独释放。
[/Quote]

十分感谢!
晨星 2009-07-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ga6840 的回复:]
回5楼:
我一直把stripes+buff当做&(stripes[buff]),这错了吗?
但我敢确定*(stripes+buff)不是指向数组元素的指针;
[/Quote]
stripes+buff就是&(stripes[buff]),这没错,但并不是说“stripes是动态申请的,它里面的每一段便都可以进行单独delete。”你动态申请了谁,就只能动态释放谁。
“*(stripes+buff)”确实不是指针,但你刚才说“释放各个元素”,让我误以为你的每个元素都是指针。因为只有动态申请的东西(并保存在指针中),才可以动态释放。
stripes+buff所指向的那个元素,只是动态申请的stripes数组的一部分,它不可以从整个数组中被拎出来单独释放。
这是个非常简单的问题,楼主可能在某个问题上短路了,呵呵。
taodm 2009-07-16
  • 打赏
  • 举报
回复
楼主啊,换本好点的教材吧。珍惜生命呀。
ga6840 2009-07-16
  • 打赏
  • 举报
回复
回5楼:
我一直把stripes+buff当做&(stripes[buff]),这错了吗?
但我敢确定*(stripes+buff)不是指向数组元素的指针;
晨星 2009-07-16
  • 打赏
  • 举报
回复
按理说 delete 数组+n 也可以啊
——哪有这个理啊。:P
你的“stripes”才是动态申请的吧?stripes + buf不是。
就好比:
int* p = new int[100];
p是动态申请的。
p + 0等于p,当然也是。
但p + 1不是。
ga6840 2009-07-16
  • 打赏
  • 举报
回复
谢谢steedhorse!
这里没有为什么吗?按理说 delete 数组+n 也可以啊
谢谢
ga6840 2009-07-16
  • 打赏
  • 举报
回复
stripes+0
stripes+1
stripes+2
。。。。
晨星 2009-07-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ga6840 的回复:]
三楼能不能继续解释一下 我没懂
谢谢!
[/Quote]
首先,我才是2楼,3楼是你自己,呵呵。
我的意思就是说:使用new申请的,就该用delete释放;使用new[]申请的,就该使用delete[]释放,比如:
int* p = new int;
delete p;
int* q = new int[2];
delete[] q;
Walf_ghoul 2009-07-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ga6840 的回复:]
二楼可能没明白我的意思,
我想用
for
delete (stripes+buff);
把每一个元素析构
但事实上,
程序结束后弹出了警告

我不知道这是为什么
[/Quote]
delete后面应该是指向分配内存的指针吧,你delete每个元素?
晨星 2009-07-16
  • 打赏
  • 举报
回复
每一个元素都是指针吗?
如果不是,
delete (stripes+buff);
岂不是很荒唐?
如果是,那应该是:
delete *(stripes+buff);
ga6840 2009-07-16
  • 打赏
  • 举报
回复
三楼能不能继续解释一下 我没懂
谢谢!
ga6840 2009-07-16
  • 打赏
  • 举报
回复
二楼可能没明白我的意思,
我想用
for
delete (stripes+buff);
把每一个元素析构
但事实上,
程序结束后弹出了警告

我不知道这是为什么
晨星 2009-07-16
  • 打赏
  • 举报
回复
使用new []动态申请的对象数组,如果使用delete释放,或者使用new动态申请的对象数组而使用delete释放,后果都将是“未定义的”。
Walf_ghoul 2009-07-16
  • 打赏
  • 举报
回复
delete[]在释放内存时,会调用数组元素的析构函数。即如果一个动态数组是一个对象数组,用delete[]来释放的话,会一次调用每个元素的析构函数,但如果用delete的话,只调用了第一个元素的析构函数,别的就没有调用了。。

64,646

社区成员

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

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