1

データを収集して一時的に両端キューに保存するプログラムがあります

    typedef vector<float> floatVector;
    ...
    floatVector * currRecord;
    deque<floatVector *> data;
    ...
    ...

    for (...)
    {
        ...
        currRecord = new floatVector(10); 
        data.push_back(currRecord);
    }

後で、データをファイルに保存したい

    while (data.size() > 0) 
    {
        for (int i=0; i < 10; i++) 
        {
            fprintf(fPtr, "%lf\t", data[0]->at(i) );
        }
    fprintf(fPtr,"\n");
    data.pop_front();
    }

だから、私の質問は、このプログラムはメモリリークを引き起こすのでしょうか?演算子を使用して、各ベクトルnewにメモリを割り当てます。currRecorddequepop_front関数は自動的にメモリをリサイクルしますか?または私は置く必要がありますか

    delete [] data[0]

    data.pop_front();

?また、dataが両端キューではなくベクトルである場合、すべてが同じになりますか?ありがとう!

4

1 に答える 1

6

のポインタがstd::dequeあり、各ポインタはリソース(メモリ)を所有しています。を呼び出すpop_front()と、コンテナからポインタが削除されますが、ポインタが所有するメモリは解放されません。でメモリを割り当てるので、newも呼び出す必要がありますdelete。コンテナが。の場合、状況は変わりませんstd::vector

std::deque<floatvector>またはのようなスマートポインタのコンテナに変更すると、メモリリークを回避できますstd::shared_ptr

[]呼び出したときに使用しなかったので、角かっこなしnewのプレーンを使用することに注意してください。delete

于 2012-07-19T05:42:09.390 に答える