gpt4 book ai didi

c++ - 派生类 vtable 已损坏?

转载 作者:搜寻专家 更新时间:2023-10-31 00:47:01 28 4
gpt4 key购买 nike

需要根帮助导致 vtable 损坏问题(不确定这是否正在发生)。这是代码的非常简化的版本。

class CBase
{
public:
CBase()
virtual ~CBase()
virtual void base_virtual_fn1() = 0;
virtual void base_virtual_fn2();
private:
CData _data;
};

class CDerived : public CBase
{
public:
CDerived();
virtual ~CDerived()
virtual void base_virtual_fn1();
virtual void base_virtual_fn2();
virtual void derived_virtual_fn1();
virtual void derived_virtual_fn2();
private:
// Contains vectors , maps, integers, bools.
};

当我创建 CDerived 的实例并调用派生类虚函数 derived_virtual_fn2 时,另一个函数被调用,即 derived_virtual_fn1。

调用 base_virtual_fnx 没有问题。

这只发生在堆上创建的对象而不是本地对象。

这些类在共享库中。我在 Linux (SLES 10) 上使用 gcc 3.4.2。这段代码中没有 pragma pack 指令,而是混合了 C 和 C++ 代码(使用了 extern c)。这可能是什么问题?

我忘了说还有很多其他代码(可执行文件、库)

最佳答案

这是我犯下的一个严重错误,我花了很长时间才找到。编译器/调试器/valgrind 没有让我深入了解发生了什么。应该有办法调试这些类型的错误:

基类在定义了“SOME_PACKAGE”的库中编译:

class interface {
virtual int function1(int);
#ifdef SOME_PACKAGE
virtual int function2(int);
#endif
virtual int function3(int);
}

class base : public interface {
int function1(int);
int function2(int);
int function3(int);
}

派生类是在没有定义 SOME_PACKAGE 的情况下编译的

class derived : public base {
int function1(int);
int function3(int);
}

对 function3 的调用导致跳转到 function2,我最终用调试器找出了这个问题,但我花了很长时间才找到原因。

关于c++ - 派生类 vtable 已损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4495662/

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