召唤调试达人,怎样知道函数推出时释放的是哪个对象?
程序出问题了,单步跟踪,发现是在函数退出时自动释放栈上的对象的时候出现访存错误。可是这个函数里申请了很多对象,我怎么能知道释放哪个对象时出的错呢?
[解决办法]
debug的时候应该会断在释放的哪里啊
[解决办法]
1 在要退出函数的时候,切换到汇编窗口
2 出错的时候看函数调用栈,那个析构函数错误,再里面加上断点.
[解决办法]
70%可能是越界
一个函数中分配多个对象不是优良的粒度设计
[解决办法]
那么估计是在操作vector是越界出错,建议加断点在操作vector处,然后检查,没有办法
退回去让she自己去检查,同时K她一顿,让她多写细粒度的函数复合,少些大杂烩~
[解决办法]
单步跟进去?
[解决办法]
数组越界,设几个断点,跟踪吧,
[解决办法]
出现这个错误的情况很多,也可能是vector里面对象析构出错。可以再对象析构中加一些信息写到log文件中查看。
[解决办法]
这个估计还是得自己仔细的一步一步去看,应该是越界。
[解决办法]
不发言,只接分
多接分,买饭吃
o(∩_∩)o...哈哈
[解决办法]
如果调用堆栈还可用,你还可以知道是在那种类型的对象出错
如果调用堆栈都破坏了,估计没招
更可恨的是:如果是内存访问越界出错,出错的类设置毫无责任,出错的地方也不是导致错误的地方,两者可以毫无关系
没好招,你得想办法从开始就加断点单步分析内存变化找
[解决办法]
在函数里面注意看vector之后定义了哪些变量,再查看是哪个越界了。重点看vector之后定义的第1个数组。
[解决办法]
[解决办法]
一个简单的办法: 在类的析构加上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析构的时候会出错。
[解决办法]
可能越界访问内存把什么东西覆盖掉了。。。
[解决办法]
看看是不堆栈烂啦啊
[解决办法]
在各个对象的西沟函数里,抓异常,写log或弹对话框.
try
{
...
}
catch(...)
{
//写log
//弹对话框
}
[解决办法]
11楼是金玉良言
另外,楼主到了该看《重构》一书的时候了。