new delete 问题

哈哈王戈多 2011-09-03 07:49:09
int main()
{
int * volatile p=new int[4];
p[0]=1;p[1]=2;p[2]=3;p[3]=4;
int *q=p;
p=p+1;
delete q;
delete[] p;
cout<<"aaaaa"<<endl;
}
这段代码老出现问题,欢迎大家指教。
...全文
152 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangw89 2011-09-03
  • 打赏
  • 举报
回复
我也觉得,释放了两次,不知道对不,学习学习
哈哈王戈多 2011-09-03
  • 打赏
  • 举报
回复
测试代码如下:
class a
{
public:
a(){cout<<"a construct"<<endl;}
~a(){cout<<"a deconstruct"<<endl;}
};
int main()
{
a *pa=new a[4];
//delete[] pa;
a* pb=pa;
//delete pb;
pa+=1;
//delete[] pa;
pb+=1;
// delete[] pb;
}
//delete pa;出现问题,看来数组指针在释放的时候 只能用[]来释放。
//delete pb;也会出现同样的问题,看来当赋值时,不仅将pb指向了pa分配的内存,而且在内存中记录pa分配了
//几个对象的n也会赋给pb,使pb具有了同pa同样的效力。
//pa+=1; delete[] pa;或delete pa都会出现问题。pb+=1; delete[] pb;也会出现同样的问题。
//总结:在堆上分配的内存的指针,不要随意修改,不然会出现bug.
masterz 2011-09-03
  • 打赏
  • 举报
回复
建议楼主用智能指针boost::shared_array, boost::scoped_array
worldy 2011-09-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 ljt350740378 的回复:]
int main()
{
int * volatile p=new int[4];
p[0]=1;p[1]=2;p[2]=3;p[3]=4;
int *q=p;
p=p+1;
delete q;
delete[] p;
cout<<"aaaaa"<<endl;
}
这段代码老出现问题,欢迎大家指教。
[/Quote]

new的内存是成块的,需要整块申请,整块释放。申请的时候,内存管理器会在记录一个内存使用的信息,包括内存指针,申请的长度等信息,释放的时候,使用你的内存指针匹配是哪个内存块,找到对应的内存使用参数,将该块内存标记信息删除;因此,你的p+1是找不到内存使用记录参数的!


另外,当申请的内存块释放的时候,最好将对应的指针设置为0,是个好的习惯,可以避免无意使用野指针。
mengmingtao 2011-09-03
  • 打赏
  • 举报
回复
你有一个数组:[][][][]
然后你开始删除:变为[]*[][]
然后你又想再删除一遍,*?**。?

然后,错误来了
jackyjkchen 2011-09-03
  • 打赏
  • 举报
回复
释放一次就够了,你只分配了一次

而且释放一定要用原始地址


int main()
{
int * volatile p=new int[4];
p[0]=1;p[1]=2;p[2]=3;p[3]=4;
int *q=p;
p=p+1;
delete[] q;
}

64,666

社区成员

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

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