問題を次のコードに減らしました。
#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メンバーのデフォルトコンストラクターを明示的に呼び出さなくても。