2
//s_request_view() constructor is declared as below
namespace Identity_VIEW
{
Published_view_identity s_request_view("SAMPLE");
};

//The constructor is called in another source file as below,
bind_view(Identity_VIEW::s_request_view);

この同じコードは Windows では問題なく動作しますが、SBC (PowerPC) では s_request_view が NULL として渡されます。

なぜ動作が異なるのか、誰かが私を助けてくれますか?

4

1 に答える 1

6

ここでの答えは、コンパイラがグローバル変数の初期化の順序を保証していないということだと思います。bind_view が別のグローバル変数のコンストラクターから呼び出された場合、フローティング バグが発生します。

次のアプローチを使用してみてください。

namespace Identity_VIEW
{
   Published_view_identity & getRequestView()
   {
      static Published_view_identity s_request_view ("Sample");
      return s_request_view;
   }
}

...
bind_view(Identity_VIEW::getRequestView());

これは、グローバル変数の初期化の順序を解決するのに役立ちます。それにもかかわらず、このソリューションはスレッドセーフではありません(気になる場合に備えて)...

于 2010-06-29T06:46:50.153 に答える