4

問題を次のコードに減らしました。

#include<iostream>
#include<stdio.h>
#include <list>
using namespace std;
class B
{
public:
    B(){
        cout<<"Default ctor of B"<<endl;
    };
};

class C
{
public:
    C()
    {
        cout<<"Default ctor of C"<<endl;
    }
    void sayHello()
    {
        cout<<"Say hello"<<endl;
    }
};
class A: public B
{
public:
    void fun()
    {
        c.sayHello();
    }
private:
    C c;
};

int main(int argc, char** argv)
{
    A* a=new A();
    a->fun();
    delete a;
    return 0;
}

A のオブジェクトを作成すると、C のデフォルト コンストラクターが呼び出されないことがわかりますが、A::fun() を呼び出すと、C::sayHello() が適切に呼び出されます。そんなことがあるものか?特定のツールチェーンでクロスコンパイルしますが、オブジェクト メモリを割り当てて、デフォルトの ctor 本体を呼び出さないにはどうすればよいでしょうか? それは明らかなコンパイラのバグのようですね。

Fedora で GCC を使用して上記のコードをコンパイルすると、すべて期待どおりに動作しました...

編集: コンパイラは、Broadcom チップセット用に調整された GCC-4.2 です。コードが実行されると、組み込みシステムに問題が存在します。それを解決するのは、デフォルトの空のコンストラクターを A に追加することです:

A(){}

初期化リストでCメンバーのデフォルトコンストラクターを明示的に呼び出さなくても。

4

1 に答える 1