召唤调试达人,怎样知道函数推出时释放的是哪个对象?

csdn5211 2008-03-09 11:39:02
程序出问题了,单步跟踪,发现是在函数退出时自动释放栈上的对象的时候出现访存错误。可是这个函数里申请了很多对象,我怎么能知道释放哪个对象时出的错呢?
...全文
500 点赞 收藏 34
写回复
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
laowang2 2008-03-11
upup
回复
LAN1403 2008-03-11
一个简单的办法: 在类的析构加上printf("ClassA destroy."); 就知道是哪个类析构出问题了。
不过最好还是加断点多跟进去看。

我曾经碰到过类似的问题,是vector的对象没有实现拷贝构造导致的。
vector的push_back()会使用拷贝构造,如果楼主用vector操作的对象有指针分配空间,并且析构的时候free这块指针,则可能出现这个问题。比如这样的代码:

class Test
{
char* data;

Test(){ data = malloc(128); }
~Test(){ free(data); }
}

int main()
{
vector <Test> v;
Test a;
v.push_back(a);
}

这样vector析构的时候会出错。
回复
LAN1403 2008-03-11
多出了一个就把涵数的返回地址给改了
这样肯定是要出错的
多出了一个就把涵数的返回地址给改了
这样肯定是要出错的
多出了一个就把涵数的返回地址给改了
这样肯定是要出错的
回复
夜雨_倚琴 2008-03-10
回21楼的,LZ都说了这个函数在他同事那里单独运行都没问题,所以我的观点是LZ系统的兼容性问题。
不妨在函数里面改用堆来申请空间,最后跟踪delete应该可以发现问题。

PS:也可能是编译器BUG也说不定。
回复
taodm 2008-03-10
11楼是金玉良言
另外,楼主到了该看《重构》一书的时候了。
回复
cad_vc 2008-03-10
在各个对象的西沟函数里,抓异常,写log或弹对话框.
try
{
...
}
catch(...)
{
//写log
//弹对话框
}
回复
csdn5211 2008-03-10
感谢大家关注,现在加100分,稍后结贴。
回复
ttlyfast 2008-03-10
看看是不堆栈烂啦啊
回复
KG6kmm310 2008-03-10
多出了一个就把涵数的返回地址给改了
这样肯定是要出错的
回复
avcoder 2008-03-10
可以写下日志之类的吧。
回复
hugh_z 2008-03-10
关注ING
回复
xiaonian_3654 2008-03-10
PS:也可能是编译器BUG也说不定。
==============================
不要动不动就说是编译器BUG,这个是很不负责任的说法。

按照你的说法,很明显是vector写越界了。
你最好能放出重现这个bug的最小代码,或者使用二分法,查找出错位置。
回复
lin_style 2008-03-09
单步跟进去?
回复
csdn5211 2008-03-09
___sbh_free_block执行不完,在~vector()这里面。
回复
我啃 2008-03-09
那么估计是在操作vector是越界出错,建议加断点在操作vector处,然后检查,没有办法
退回去让she自己去检查,同时K她一顿,让她多写细粒度的函数复合,少些大杂烩~
回复
csdn5211 2008-03-09
Unhandled exception : 0xC0000005 : Access Violation.
回复
星羽 2008-03-09
你可以把出错信息发上来看看吗
回复
csdn5211 2008-03-09
to 八音盒:

我也知道,可是这个函数不是我写的,她自己单独调试的时候没问题,加到我的系统里就这样了。
回复
csdn5211 2008-03-09
to 星羽:
我知道基本就是这种情况,可是怎么才能知道哪个str多写了呢?
回复
我啃 2008-03-09
70%可能是越界
一个函数中分配多个对象不是优良的粒度设计
回复
发动态
发帖子
C++ 语言
创建于2007-09-28

5.9w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
社区公告
暂无公告