1

std::vector私は何の意味も理解できないこの奇妙な振る舞いにぶつかり続けています。

大まかに、コードは次のようになります

#include <iostream>
#include <vector>

class MyClass{
public:
  MyClass():
    v_(),
    w_(init_w())
  {};

  ~MyClass()
  {};

  std::vector<int*> init_w()
  {
    v_.resize(4096);
    return v_;
  };
private:
  std::vector<int*> w_;
  std::vector<int*> v_;
};

int main()
{
  MyClass a;
}

これを実行すると、で悪いセグメンテーション違反が発生しresizeます。代わりに低い値が選択された場合resize、コードはセグメンテーション違反をまったく起こさない可能性があります。

更新: 問題は、イニシャライザ リストが示す内容とは反対に、 のw_前に初期化されることv_です。したがって、 ではinit_w()v_状態は定義されていません。v_宣言内のとの順序を元に戻すとw_、問題が修正されます。

4

1 に答える 1

2

問題は、イニシャライザ リストが示すものとは反対に、w_ が v_ の前に初期化されることです。

あなたはそう推測しましたが、実際にはそうではありません。リストの順序は関係ありません。クラスでの宣言の順序は次のとおりです。したがって、メンバーが実際にどのように初期化されているかを確認したい場合は、初期化リストで宣言順序を模倣する必要があります。

あなたへの私の質問は次のとおりです。そもそもなぜポインターのベクトルを使用しているのですか? deleteオブジェクトが範囲外になったり、メモリ リークが発生したりする前に、リスト内のすべての要素を取得する必要があることを認識していますか?

于 2012-07-26T23:46:05.360 に答える