あなたの例の初期化はあなたが望む順序で行われますが、それはあなたが想定する理由ではありません.初期化はクラス定義のデータメンバー宣言の順序で行われます. この理由は、オブジェクトの作成に使用されたコンストラクターに関係なく、デストラクタがメンバーを逆順に破棄する必要があるためです。そのためには、構築順序を定義するコンストラクタに依存しない方法を使用する必要があります。
つまり、代わりに
class myClass
{
private:
...
int m_nDataLength;
boost::shared_array<int> m_pData;
誰かがあなたのコードを
class myClass
{
private:
...
boost::shared_array<int> m_pData;
int m_nDataLength;
その場合、コードにはバグがあります。
私のアドバイスは次のとおりです。
- 初期化の順序が問題にならないようにコンストラクタを記述します。
- これができない場合 (注: 過去 10 年間に発生したのは 5 回未満)、データ メンバーが宣言された時点で完全に明確にしてください。
このようなことをする必要があります:
class myClass
{
private:
...
int m_nDataLength; // Note: Declaration order
boost::shared_array<int> m_pData; // matters here!