1

私は長い間 C++ を使っていませんでしたが、今は小さな「プロジェクト」を行う必要があります。
結果が得られない問題の解決策を見つけようとして、いくつかのトピックを確認しました...

これが「疑似コード」Pairです(私のクラスです):

Pair** pairs;

入力からテーブルのサイズを取得し、ポインターのテーブルを作成します。

pairs = new Pair*[size];

オブジェクトを作成し、その参照をポインタのテーブルに入れるループがあります。多かれ少なかれ:

while (...)
{
    Pair pair(...); // calling constructor, creating object type of Pair.
    pairs[i] = &pair;
    i++;
}

問題は、毎回&pair(ループのすべてのステップで)同じ数になることです。最初に作成されたオブジェクトのアドレスが 1234 であるとします。したがって、ループ内のすべてのステップで、このオブジェクトを 1234 でオーバーライドします。したがって、各ポインタpairsは同じアドレスを指します -> 同じオブジェクト。このオブジェクトをメモリ内の新しい場所に強制的に作成したいと思います。

これらのオブジェクトを他のテーブルに配置してから、それらの参照をポインターのテーブルに渡そうとしています。

Pair* clearPairs = new Pair[size];
while (...)
{
    clearPairs[i] = Pair(...);
    pairs[i] = &clearPairs[i];
    i++;
}

しかし、問題はまだ発生します。

ヒントはありますか?、私のコード (または思考) の間違い/エラーはありますか? 「コピーコンストラクタ」を実装しますか?

4

1 に答える 1

4
while (...)
{
    Pair pair(...); // calling constructor, creating object type of Pair.
    pairs[i] = &pair;
    i++;
}

pair自動ストレージ期間が割り当てられ、ループの反復ごとに範囲外になります。無効なオブジェクト (それらの束) へのポインターを保存しています。

ポインターが本当に必要な場合は、スマート ポインターのコレクションを使用する必要があります (これは、オブジェクトをコピーできない場合やコピーにコストがかかる場合に当てはまります)。これは、まったく必要ない場合があります。代わりにこれを試してください:

vector<Pair> pairs;
// and if you need pointers...
vector<unique_ptr<Pair>> pairs;

while(whatever) {
    pairs.push_back(Pair(...));
    // or...
    pairs.push_back(unique_ptr<Pair>(new Pair(...)));
}
于 2012-11-10T19:41:02.053 に答える