gpt4 book ai didi

c++ - Visual Studio 2008 - vftable 指针不正确? Debug模式崩溃,Release没问题

转载 作者:行者123 更新时间:2023-11-28 03:23:12 27 4
gpt4 key购买 nike

我目前正面临 VS08 的问题。我得到了以下(简化的)类结构:

class CBase
{
public:
virtual void Func() = 0;
};

class CDerived : public CBase
{
public:
void Func();
};

此代码在 Release模式下运行良好,但当我尝试运行调试构建时,它立即在 new CDerived 处崩溃。

进一步分析让我找到了崩溃的位置。它在 CBase::CBase(编译器生成的构造函数)处崩溃。更准确地说,它在 04AE46C6 mov dword ptr [eax],offset CBase::vftable' (505C2CCh) `处崩溃。

有什么线索吗? Release模式很好,但我无法正确调试它。

最佳答案

Release Mode is fine

不,看起来还不错。我的猜测是在调试中内存以某种方式被覆盖。由于无法仅根据您发布的代码来判断,因此您可以执行以下操作。

我假设你在某处创建对象:

CBase* p = new CDerived;

或类似的。在 Debug模式下,在 p 的位置设置一个内存断点。您可以将其设置为监视 4 个字节。 Visual C++(像大多数编译器一样)会将 vfptr 保持为类中的第一件事,因此该断点将跟踪该位置是否被覆盖。如果在您调用崩溃的函数之前命中断点,那就是您的问题(并且调用堆栈会告诉您它被覆盖的原因)。

这可能有很多原因——你可能会溢出一些内存并覆盖对象(如 Erik 所建议的)——发布版本可能会直接解析调用以防止动态调度的开销,这可以解释为什么它不是崩溃。

也可能是您在对象上调用了 delete 并且调试版本实际上将内存归零,而发布版本则没有。仅凭这一点无法判断。

关于c++ - Visual Studio 2008 - vftable 指针不正确? Debug模式崩溃,Release没问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14863150/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com