【发布时间】:2010-02-24 13:20:46
【问题描述】:
我们这几天一直在调试一个奇怪的案例,并在一定程度上隔离了这个错误,但它仍然没有任何意义。也许这里的任何人都可以给我一个关于发生了什么的线索。
问题是发生在部分代码中的访问冲突。
基本上我们有这样的东西:
void aclass::somefunc() {
try {
erroneous_member_function(*someptr);
}
catch (AnException) {
}
}
void aclass::erroneous_member_function(const SomeObject& ref) {
// { //<--scope here error goes away
LargeObject obj = Singleton()->Object.someLargeObj; //<-remove this error goes away
//DummyDestruct dummy1//<-- this is not destroyed before the unreachable
throw AnException();
// } //<--end scope here error goes away
UnreachableClass unreachable; //<- remove this, and the error goes away
DummyDestruct dummy2; //<- destructor of this object is called!
}
在调试器中,它实际上看起来像是在破坏 UnreachableClass,当我插入 DummyDestruct 对象时,它不会在调用奇怪的析构函数之前被破坏。因此,LargeObject 的破坏似乎并没有出错。
所有这些都在生产代码的中间,很难将其隔离为一个小示例。
我的问题是,有没有人知道是什么原因造成的,以及发生了什么?我有一个功能齐全的调试器(Embarcadero RAD 工作室),但现在我不知道如何处理它。
谁能给我一些关于如何进行的建议?
更新:
我在 throw 子句下方放置了一个 DummyDestruct 对象,并在析构函数中放置了一个断点。输入了这个对象的析构函数(只有我们在这段代码中)。
【问题讨论】:
-
如果显式调用不可达的构造函数怎么办?我认为局部变量在它声明的范围开始时被“初始化”,除非使用了一些构造函数。
-
你得到什么错误?哪条线导致它?
-
你在编译什么优化?
-
@phtrivier 我遇到了访问冲突,它不会发生在任何行上,并且堆栈展开确实会留下很多调用堆栈来说明错误实际发生的位置。我可以看到实际上是一个字符串被破坏,但字符串的位置似乎在堆栈“上方”,在内存中当前未用于任何事情。 @bill 我不使用任何优化标志,例如 -O 或 -O2 但我不知道 ide 在编译时设置的每个标志。
-
您是否打算在堆栈上制作 LargeObject 的副本,LargeObject 有多大?它会比堆栈大吗?我还认为,当您说错误消失时,我认为实际上错误仍然存在,但是通过好(或坏)运气,在这些情况下不会导致立即崩溃。
标签: c++ debugging c++builder access-violation