0

私はいくつかの Java を C++ に移植していますが、単純にstd::vector.

これが私の問題です。私はオブジェクトのリポジトリを持っており、後である時点で、このリポジトリから何らかの条件を満たすオブジェクトのリストが必要になります。現在、それらを一時的に読み込んでいますstd::vector。この一時的なオブジェクトが範囲外になるdeleteと、その内容が失われ、もちろん、リポジトリ内でポインタがぶら下がっていることがわかります。

これは私の現在の「回避策」であり、特に嫌だと思います。

#define NULLIFY(aParam) \
{ \
    for (size_t i = 0; i < aParam.size(); i++) { \
        aParam[i] = NULL; \
    } \
}

typedef std::vector<Object*> TObjectVector;

int main(int argc, char* argv[])
{
    PopulateRepository(); // repository uses std::set

    TObjectVector subset;
    Repository.GetConditionSatisfyingObjects(subset);
    DoSomething(subset);

    NULLIFY(subset); // Stop destruction of the objects.
}

私は他のアイデアを受け入れます。私は元々、生のポインターと動的割り当てですべて動作していましたが、渡すパラメーターが少なくなるため、STL を使用すると速度が向上するかどうかを確認したかったのです。このプログラムはマルチスレッドであり、かなり CPU を集中的に使用します。

4

1 に答える 1

5

のようなポインタのベクトルがある場合std::vector<Object*>Objectデストラクタは呼び出されません。

また、 などのオブジェクトのベクトルがある場合は、ベクトルに「配置」されたもののコピーstd::vector<Object>を格納します。そのため、ぶら下がっているポインターがどこから来るのかわかりません。

于 2012-08-12T22:23:58.383 に答える