c++ - GCC:调用静态对象的重写函数时出现异常

标签 c++ gcc heap-memory virtual

我正在使用 GCC 3.4.3。该设备是基于ARM9/ARM11的POS终端PAX S80。下一个测试代码编译正常,但在运行时调用重写函数时出现异常。

class TBase {
public:
    int a;
    virtual void Foo()  {a = 1;}
            void Exec() {Foo();}
};

class TDerived : public TBase {
public:
    virtual void Foo()  {a = 2;}
};

TBase    *Base;       //pointer to object in heap
TBase    Base2;       //static object

TDerived *Derived;    //pointer to object in heap
TDerived Derived2;    //static object

int main() {

    Base = new TBase;
    Base->Exec();              //this passes okay

    Base2.Exec();              //this passes okay

    Derived = new TDerived;
    Derived->Exec();           //this passes okay

    Derived2.Exec();           //here I get an exception and the app crashes

    return 0;
}

这意味着我不能使用静态对象(Derived2)。是的,我可以在代码中创建对象(派生),但它使代码变得复杂,因为我需要使用“new”运算符实例化对象。

有什么技巧可以避免这个问题吗?

顺便说一句,我在 ARM926 的 Keil 编译器上没有这个问题。不幸的是,我无法为该设备选择编译器,只能选择 GCC 3.4.3。

感谢您的任何想法!

最佳答案

原因是静态对象的初始化没有发生。所以,我决定手动完成。

首先,我将以下几行添加到链接器脚本 ( source ):

__ctors_start__ = .;
KEEP(SORT(*)(.ctors))
__ctors_end__ = .;

其次,我调用一个函数,该函数调用静态对象的所有构造函数 ( source ):

void do_ctor_calls() {

    typedef void (*call_ctor_t)(void);
    extern call_ctor_t __ctors_start__[];
    extern call_ctor_t __ctors_end__[];

    call_ctor_t * ctor_call = __ctors_start__;
    while ((ctor_call < __ctors_end__)&&((unsigned int)*ctor_call!=0xFFFFFFFF)&&((unsigned int)*ctor_call!=0x00000000)) {
        (*ctor_call)();
        ctor_call++;
    }
}

int main() {
    do_ctor_calls();

    /* My code here */

    return 0;
}

最终,重写的函数可以正常工作,静态对象也可以照常运行。 感谢大家!

关于c++ - GCC:调用静态对象的重写函数时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31918453/

相关文章:

c++ - 比较 C++ 中的类类型

C++ 或 C++0x - 哪个标准更好?

c - gcc/g++ 有 x64 微软寄存器的调用约定吗?

java - Used vs Max vs Size -Jvisualvm?

c++ - C++在内存的什么地方创建栈和堆?

使用 -Xmx 1g 不会增加 Java 堆空间

c++ - 使用指向类内部结构的指针

c++ - 来自 json 的 QJsonDocument

c - gcc 优化涉及常量位运算的代码

c# - 为什么编译器不喜欢隐式转换为 uint?