如何测试一个指针指向的堆内存是否已经被释放

yozola 2011-11-28 10:30:07
如题,我用的是GCC的编译器,好像释放成功的话,指针指向的头4个字节的内容会归零,不过后面的内容保持不变,这样我就不知道后面的内存是否已经被释放成功了。还有问一下分配的一整段内存,可不可以只释放其中的一部分,比如分配了5个int的内存,我从第3个int开始把后面都释放掉,只留下前两个int,(不是另开辟内存),这样可以么?
...全文
1278 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2011-11-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yozola 的回复:]

引用 8 楼 ri_aje 的回复:
无论如何,只要 delete [] 成功返回,对于 C++ 来说,就是成功释放了。因此测试的方法就是看 delete [] 能否成功返回。

delete[]执行成功的话返回什么?怎么测试?
[/Quote]
这不是很简单吗。delete[] 下面的语句能够正常执行,不就说明 delete[] 成功返回了吗?比如,你写
delete [] p;
p = 0; // 要是能执行到这句,就说明上面那句成功返回了
iamnobody 2011-11-30
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yisikaipu 的回复:]
release版的不见得会崩溃,debug版会崩溃是因为嵌入了检查

[/Quote]

你还真的试了。。。那只是开个玩笑。

本来就是错误的行为,没有讨论的必要。
yisikaipu 2011-11-30
  • 打赏
  • 举报
回复
release版的不见得会崩溃,debug版会崩溃是因为嵌入了检查

windows下的情况,free的参数无效(EINVAL)时,不会释放任何内存,如同没有写free一样,除了设置一个错误值

当p不是头部,p是无效参数
当p已经free过了,p是无效参数

delete也一样

所以不能分配一段内存却只释放其一部分

int main()
{
char *p=(char*)malloc(5);
free(p+1);

int val;
_get_errno(&val);

cout <<val <<endl; // EINVAL 22

return 0;
}
iamnobody 2011-11-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yozola 的回复:]
引用 8 楼 ri_aje 的回复:
无论如何,只要 delete [] 成功返回,对于 C++ 来说,就是成功释放了。因此测试的方法就是看 delete [] 能否成功返回。

delete[]执行成功的话返回什么?怎么测试?
[/Quote]

不用测试,不成功的话程序会直接崩溃掉,你就看程序是否崩溃来判断是不是已经被释放了吧。
Snight 2011-11-29
  • 打赏
  • 举报
回复
你所想的功能 系统是没法帮你做。除非自己做封装,譬如内存池
ri_aje 2011-11-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yozola 的回复:]

引用 1 楼 icechenbing 的回复:
释放内存后要把指针致NULL。

可以的。

这个是在确切知道已经释放成功之后,才把指针重置为0,不过我的问题是怎么判断指针指向的内存已经被完全释放了?或者说已经被释放成功了,有什么测试方法么?
delete [] 是不是只要一释放就把之前分配的整段内存全部释放?若是指针不是指向数组首元素的地址,而是指向数组其他元素的地址,那delet……
[/Quote]
这个是在确切知道已经释放成功之后,才把指针重置为0,不过我的问题是怎么判断指针指向的内存已经被完全释放了?或者说已经被释放成功了,有什么测试方法么?
所谓释放不释放内存就是操作系统怎么看这段内存的问题。C++ 说 delete [] 释放内存,意思是说 delete [] 以后,操作系统就可以将此内存回收利用了,C++程序也不会再利用这段内存了(在再次new之前)。但有些操作系统比较懒(内存分配算法导致),就是搁那不管,非得到下次 new 内存不够的时候,才集中处理之前 delete [] 的内存,这你也没办法。无论如何,只要 delete [] 成功返回,对于 C++ 来说,就是成功释放了。因此测试的方法就是看 delete [] 能否成功返回。

delete [] 是不是只要一释放就把之前分配的整段内存全部释放?
是的。

若是指针不是指向数组首元素的地址,而是指向数组其他元素的地址,那delete操作是成功还是失败?
释放数组类型必须用 delete [], 用 delete 叫 undefined behavior (UB).
delete [] 的操作数必须是之前相应的 new [] 返回的结果,鉴于 new [] 只会返回数组首元素指针,delete [] 数组其他元素的指针也产生 UB.
C++ 程序员的基本素养之一就是努力写不产生 UB 的程序。
yozola 2011-11-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ri_aje 的回复:]
无论如何,只要 delete [] 成功返回,对于 C++ 来说,就是成功释放了。因此测试的方法就是看 delete [] 能否成功返回。
[/Quote]
delete[]执行成功的话返回什么?怎么测试?
quwei197874 2011-11-28
  • 打赏
  • 举报
回复
用boundcheck等检测工具
gelinsipan 2011-11-28
  • 打赏
  • 举报
回复
不是很清楚楼主为什么要自己检测内存释放了没。
如果要自己管理内存,那么:1) pointer = new xxx 2) use pointer 3) delete pointer and pointer = null. 或者用scoped_ptr或者shared_ptr管理内存。使用shared_ptr你自己不用判断是否释放了,什么时候释放,shared_ptr自己会通过引用计数自动管理。

另外,delete[]得是数组的头,见http://topic.csdn.net/t/20020424/16/673147.html。
yozola 2011-11-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 icechenbing 的回复:]
释放内存后要把指针致NULL。

可以的。
[/Quote]
这个是在确切知道已经释放成功之后,才把指针重置为0,不过我的问题是怎么判断指针指向的内存已经被完全释放了?或者说已经被释放成功了,有什么测试方法么?
delete [] 是不是只要一释放就把之前分配的整段内存全部释放?若是指针不是指向数组首元素的地址,而是指向数组其他元素的地址,那delete操作是成功还是失败?
qscool1987 2011-11-28
  • 打赏
  • 举报
回复
你的第二个问题需要传说中的内存池来实现,不然你肯定导致泄露
iamnobody 2011-11-28
  • 打赏
  • 举报
回复
无法做到。。。不要依赖某个平台的实现
羽飞 2011-11-28
  • 打赏
  • 举报
回复
这个,楼主可以自己重载new和delete
系统提供的new和delete好像没有这个功能
恨天低 2011-11-28
  • 打赏
  • 举报
回复
释放内存后要把指针致NULL。

可以的。

64,642

社区成员

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

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