- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正面临 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/
我已阅读以下帖子 Virtual dispatch implementation details只有一件事我不清楚。 给定一个多态 Base 和一个派生类 - 编译器是否为每个派生对象复制 vftab
什么是高级编程语言中的 vftable? 我读到类似虚拟对象结构地址的内容,但这是一个非常困惑的信息 有人可以解释一下吗? 最佳答案 它很可能代表“Virtual Function Table ”,并
我使用的是 visual studio 2008、c++、win32,没有点网。 我遇到了在父级的析构函数中调用的虚函数的问题。例如,以类 a 和 b 为例。 a类有一个虚函数叫Hello();调用时
C++ 问题在这里。我有一个系统,其中我将拥有给定父类(super class)的数百个迷你子类。他们都有一个做某事的“foo”方法。或者...我将拥有一个名为“type”的整数类,并使用一个巨大的
出于学习目的,我已经使用/nodefaultlib 构建了一个可执行文件,但我觉得我在 winmain 之前的入口点做错了,因为每当我使用虚拟方法时,我都会收到链接器错误: error LNK2001
我目前正面临 VS08 的问题。我得到了以下(简化的)类结构: class CBase { public: virtual void Func() = 0; }; class CDer
在尝试使用多态性时,我尝试过如下操作: class a { virtual void method() { } }; class b { virtual void method() { } }; cl
我们都知道 C++ 使用 vftable 来动态决定应该调用哪个虚函数。而我想弄清楚我们调用虚函数时背后的机制。我已将以下代码编译为程序集。 using namespace std; class An
我有一个名为 test.exe 的 exe,通常用作独立应用程序。我想在另一个应用程序 app.exe 中将此 exe 作为模块(dll)使用。 test.exe 中的代码做了一些非常简单的事情,比如
我正在使用 dbghelp 中的 UnDecorateSymbolNameW 来取消修饰 Microsoft 符号名称。当使用 UNDNAME_COMPLETE 取消修饰时,符号名称有时会包含某些编译
(这是一个关于软件设计的大问题。如果它不适合 StackOverflow,我愿意将它复制到软件工程社区) 我正在使用 heap_stat,一个调查转储的脚本。这个脚本基于这样的想法,对于任何具有虚函数
我是一名优秀的程序员,十分优秀!