QList変数があります。Xインデックスから始まり、後続のすべてのN要素を削除して、メモリも解放するようにするには、どうすればすべての要素を消去できますか?
1 に答える
まず第一にMyClass*
、 のインスタンスを「所有」する (つまり、の寿命を制御する) ために を使用しないでくださいMyClass
。したがって、 のリストも のMyClass*
インスタンスを「所有」してはなりませんMyClass
。delete
したがって、これらのポインターのいずれかでオペレーターを使用することはありません(そしてdelete
、スマートポインターの実装の外側に迷い込むと、ほとんどの場合、眉をひそめるはずです)。
QList
実際、同様のユースケース向けに最適化されたタイプです。Aは(ポインタより大きい場合)QList<MyClass>
の動的配列を内部的に格納するため、リストの並べ替えと展開は潜在的に安価です。ただし、要素を削除せずにリストから削除する必要がある場合は、 aまたは類似のものを使用する必要があります。いずれにせよ、オブジェクトの寿命について心配する必要はありません。リストからそれらを削除するだけです。MyClass*
MyClass
QList<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()
)。