2

QList変数があります。Xインデックスから始まり、後続のすべてのN要素を削除して、メモリも解放するようにするには、どうすればすべての要素を消去できますか?

4

1 に答える 1

1

まず第一にMyClass*、 のインスタンスを「所有」する (つまり、の寿命を制御する) ために を使用しないでくださいMyClass。したがって、 のリストも のMyClass*インスタンスを「所有」してはなりませんMyClassdeleteしたがって、これらのポインターのいずれかでオペレーターを使用することはありません(そしてdelete、スマートポインターの実装の外側に迷い込むと、ほとんどの場合、眉をひそめるはずです)。

QList実際、同様のユースケース向けに最適化されたタイプです。Aは(ポインタより大きい場合)QList<MyClass>の動的配列を内部的に格納するため、リストの並べ替えと展開は潜在的に安価です。ただし、要素を削除せにリストから削除する必要がある場合は、 aまたは類似のものを使用する必要があります。いずれにせよ、オブジェクトの寿命について心配する必要はありません。リストからそれらを削除するだけです。MyClass*MyClassQList<unique_ptr<MyClass>>

私が言ったので、探しているものを達成するのに役立ついくつかの便利な STL イディオムがあり、それらは (ほとんどの) Qt コンテナーにも適用されます (編集: 削除を修正し、いくつかの役立つコメントを追加しました):

QList<MyClass*> myList; //TODO FIXME XXX: clarify mentioned ownership issues
assert(X + N <= myList.size());

// this is the range of objects we want to remove and delete
// (N elements, starting from index X)
auto range_begin = myList.begin() + X,
     range_end = range_begin + N;
// delete each object in range
std::for_each(range_begin, range_end, [](MyClass* ptr) { delete ptr; });
// remove them from the list
myList.erase(range_begin, range_end);

の後にすべての要素を削除するつもりであれば、さらに簡単ですmyList[X - 1](つまり、 に置き換えrange_endますmyList.end())。

于 2012-08-12T21:32:02.197 に答える