0

これは少し刺すつもりです:\。これは私のマップ宣言です:

std::map<std::string, std::shared_ptr<std::vector<std::shared_ptr<BaseEntity> > > > m_EntityByClassList;

本当に、それがとても長い唯一の理由は、スマートポインタ宣言のためです、それはほとんどこれだけです:

std::map<std::string, std::vector<BaseEntity *> *> m_EntityByClassList;

それでも読むのは苦痛です。これが私の問題です。マップ内の新しいベクトルにオブジェクトを挿入しようとすると、「読み取りしようとしているアクセス違反」ランタイムエラーが発生します。

このエラーを生成するコードのチャンクはこれです、

for(;;)
    {
        file >> classname;
        if(file.eof())
            break;
        m_EntityList.push_back( m_factory.createInstance(classname));
        m_EntityList.back()->Initialize();
        m_EntityList.back()->GetParams(file);
        m_EntityByNameList[m_EntityList.back()->GetName()] = m_EntityList.back();
        m_EntityByClassList[classname]->push_back(m_EntityList.back());
    }

はい、確かにここで省略しているコードはたくさんあります。これは主に、ここでこの宣伝文句に入る35または36のオブジェクトとファイルがあるため、関連するものをリストアップするだけです。fileはstd::ifstream開いているファイル、classnameはstd::string、m_EntityListはstd::vector<std::shared_ptr<BaseEntity> >(重要ではありません)、m_EntityByNameListはインデックスタイプstd::stringとオブジェクトタイプstd::shared_ptr<BaseEntity>(これも重要ではありません)のマップであり、次に上のマップです。最後のステートメントの上のすべてのステートメントは、検証された結果で正確に機能します。最後の行を省略すると、コンパイルされて正常に動作します。

したがって、この質問は残りのファイルとは関係がなく、マップにベクトルを追加してオブジェクトを追加しようとするだけです。他に何か必要だと思われる場合は、質問してください。ここに投稿する方法について説明します。すべてを投稿すると、4000〜4500行になります。

Annnnyway、これからマップについて学んだこと、まだ存在していないインデックスで[]演算子を使用すると、そのインデックスにデフォルトで構築されたオブジェクトとともに作成されたものになるということです。したがって、これから得られるのはstd::shared_ptr<std::vector<std::shared_ptr<BaseEntity> > >、インデックスクラス名で作成されるということです。これは、ベクターが事前に作成されたか、直前に作成されたかに関係なく、ベクターにアクセスできる必要があることを意味します。それで、誰かが何が起こっているのか手がかりを持っていますか?

4

1 に答える 1

1

存在しないキーを使用operator[]してマップ上で使用すると、実際に新しいが挿入されshared_ptrます。ただし、考慮していないのは、newshared_ptrが空(つまりnullポインター)になるため、参照を解除すると未定義の動作が発生することです。新しいベクトルは作成されません。ベクトルへのポインタを使用しているため、新しいベクトルを自分で割り当てる必要があります。

マップの値型が、それへのポインターではなくベクトル自体である場合、期待どおりに自動的に作成されます。

于 2012-07-01T14:50:48.383 に答える