English 中文(简体)
调用方法时出现访问冲突异常。
原标题:Access violation exception when calling a method

我在此提出一个奇怪的问题。 假定我有一个带某些<>虚拟方法的班级。 在某些情况下,这种类别应当称为其中一种方法。 大部分时间没有出现任何问题,但有时甚至会发现,无法使用虚拟方法,因为这种方法的指点是NUL(如VS所示),因此发生违约记忆。 如何做到这一点?

应用程序非常庞大和复杂,因此我不知道哪些低级步骤会导致这种情况。发布原始代码是没有用的。

更新:好的,我明白我的问题陈述比较不明确,所以示意图代码如下。

void MyClass::FirstMethod() const { /* Do stuff */ }
void MyClass::SecondMethod() const
{
    // This is where exception occurs, 
    // description of this method during runtime in VS looks like 0x000000
    FirstMethod(); 
}

没有构造函数或析构函数涉及。

最佳回答

减少腐败可能是候选人。 物体的易腐点,通常是物体的第一个领域。 可能与物体相邻的某种其他物体的缓冲溢流将冲淡出变点。 采用虚拟方法的呼吁往往会受到打击。

另一个经典的案例是拥有一个糟糕的“this”指针,通常为NULL或低值。这种情况发生在您调用方法的对象引用不良的情况下。方法将正常运行,但是一旦它尝试访问类成员,它就会崩溃。再次,堆破坏或使用已删除的指针会导致此问题。祝你调试顺利;这从来不容易。

问题回答

可能您正从一个基类的构造函数(直接或间接地)调用该函数,而该基类本身并没有该函数。

在涉及多重继承时,可能会出现一个破裂的地方(例如:reinterpret_cast),你重新审视错误类别。

可能(但不太可能)你已经不小心删除了虚函数表。

该功能的指点是否仅对这个物体或对同类其他物体无效? 如果前者被打破,那么 v点就会被打破,你会重新看错。 如果后者的话,那么表态本身就会破裂。

可能发生这种情况的一个场景是,在析构函数或构造函数中尝试调用一个纯虚函数。此时,该函数的虚函数表指针可能未初始化,从而导致崩溃。

在 SecondMethod 处理期间,"this" 指针是否有可能被删除?

另一种可能性是,第二次机会实际上被称作是右线上站的无效者,而只是(通过不明确的行为)在后来失败的空洞功能上工作。 如果你能够补充印刷法,检查是否使用“这种”和(或)其他指点器,如在实施这些方法时各个点使用0-xcdcdcdcdcdddcd或0xfdfdfdfdfdfd。 这些价值观(我认为)被科索沃统计局用于记忆中/分配,这可能是为什么它以欺骗方式汇编成册。

你现在最有可能看到的是实际问题的副作用。最有可能是堆或内存损坏,或引用先前释放的对象或空指针。

如果您可以始终在相同的位置崩溃并且可以找出null指针从何处加载,则建议使用调试器并在该内存位置上设置断点写,在断点触发后,最有可能您正在查看实际引起损坏的代码。

如果仅当Studio无法显示方法地址时发生内存访问违规,那么可能是由于缺少调试信息引起的。您可能正在调试使用发布(非调试)编译器/链接器标志编译的代码。

尝试在项目的C++属性中启用一些调试信息,重建并重新启动调试器。 如果有帮助,您将看到所有正常可跟踪的事物,如堆栈、变量等。

如果您的此指针为空,则不太可能出现损坏。除非您将内存清零。

您没有说明您是在调试Debug(未优化)还是Release(优化)版本。通常,在Release版本中,优化器会在不需要时删除该指针。因此,如果您正在调试优化版本,并且看到此指针为0,这并不意味着任何内容。您必须依靠反汇编来告诉您发生了什么。如果您无法在Debug版本中重现问题,请尝试关闭您的Release版本中的优化。在调试优化版本时,您正在调试汇编而不是C ++。

如果您正在调试非优化生成版本,请确保在花费过多时间来调试损坏的图像之前先进行干净的重建。调试生成版本通常是增量链接的,因此增量链接器会产生此类问题。如果您正在使用干净生成版本运行调试生成版本,但仍然无法确定出错原因,请发布堆栈转储和更多代码。我相信我们可以帮助您找到答案。





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签