Vector::Erase はポインタのベクトル内のオブジェクトを破棄しますか?
オブジェクト ポインタを含むベクトルを扱う場合、ベクトルを使用して要素を消去します::erase() は、ポイントされたオブジェクトの運命について懸念を引き起こします。 Vector::erase() はベクターから要素を削除しますが、実際のオブジェクトは自動的に破棄されません。
Vector::Erase の動作
Vector:: Erase() はベクターから要素を削除しますが、オブジェクトを破棄する所有権は取得しません。ただし、含まれているオブジェクトが生のポインターである場合、vector::erase() は削除前にそのデストラクターを呼び出しません。
生のポインターの処理
適切なリソースを確保するため管理する場合、含まれる各ポインターを明示的に削除して、それらが指すオブジェクトを削除する必要があります。これはループを使用して実現できます。
<code class="cpp">void clearVectorContents(std::vector<YourClass *> &a) { for (int i = 0; i < a.size(); i++) { delete a[i]; } a.clear(); }
生のポインターの回避
生のポインターを標準コンテナーに保存することは、一般的に推奨されません。動的に割り当てられたオブジェクトの場合は、boost::shared_ptr などのスマート ポインタを使用してメモリ管理を処理することを検討してください。
汎用的でエレガントなソリューション
より洗練されたソリューションでは、テンプレートと for_each を利用します。アルゴリズム:
<code class="cpp">// Functor for deleting pointers in vector template<class T> class DeleteVector { public: void operator()(T x) const { delete x; } };</code>
このファンクターを for_each と一緒に使用すると、ベクトル内のポインターを削除できます:
<code class="cpp">for_each(myclassVector.begin(), myclassVector.end(), DeleteVector<myclass *>());</code>
使用例
myclass オブジェクトへのポインターのベクトル。次のコードは、オブジェクトの割り当て、出力、削除を行います:
<code class="cpp">#include <iostream> #include <vector> #include <algorithm> #include <functional> class myclass { public: int i; myclass(): i(10) {} }; // Functor for deleting pointers in vector template<class T> class DeleteVector { public: void operator()(T x) const { delete x; } }; int main() { // Vector of myclass pointers std::vector<myclass *> myclassVector; // Add objects to the vector for (int i = 0; i < 10; i++) { myclassVector.push_back(new myclass); } // Print object values for (int i = 0; i < myclassVector.size(); i++) { std::cout << " " << (myclassVector[i])->i; } // Delete objects using functor and for_each for_each(myclassVector.begin(), myclassVector.end(), DeleteVector<myclass *>()); // Clear the vector myclassVector.clear(); // Print the empty vector size std::cout << "\n" << myclassVector.size(); return 0; }</code>
以上が`vector::erase()` はポインタのベクトル内のオブジェクトを破棄しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。