2

カスタム オブジェクトのベクトルがあります。

vector<MyObject*> newOnes;

それを埋めるいくつかの操作の後、newOnesはオブジェクトが重複する可能性があるため、std:unique()を使用します。

std::unique(newOnes.begin(), newOnes.end(), isEquivalent); //isEquivalent return true if equal

ベクトルの使用が完了したら、次の関数を使用してメモリを解放します。

void MyCalss::releaseSource(vector<MyObject*> v) {
    for (unsigned int i = 0; i < v.size(); i++ )
        delete v[i];
}

実行releaseSource(newOnes); 時 これによりクラッシュが発生します。std:unique がダングリング ポインターを作成しているためクラッシュしていることはわかっていますが、ここではスマート ポインターを使用できません。

これを回避するには、ここで何ができますか?

以下のように std:unique を使用すると問題は解決しますか?

std::sort(new_combs.begin(), new_combs.end());
newOnes.erase(std::unique(newOnes.begin(), newOnes.end()), newOnes.end());
//// so operations
releaseSource(newOnes); //still need to free the other members

現在、スマート ポインター (一意/共有) に移動できません。それには、私が変更できないコードへの変更が含まれます。

ここで std::set を使用して重複を削除できますか?

4

2 に答える 2

2

unique は vector 内のオブジェクトを削除しません。ただし、std::unique は vector 内の一部の要素をコピーする場合があります。たとえば、int の vector に [1 2 2 3 4] の要素がある場合。その場合、unique の結果は [1 2 3 4 4] です。ご覧のとおり、要素 '4' は一意にコピーされました。この状況をポインタに移してみましょう。ベクトルの '4' がポインタの場合、 を使用releaseSourceしてポインタを削除すると、'4' が 2 回削除されます。これがクラッシュが発生する理由です。

于 2013-04-13T11:25:26.053 に答える