Vector::erase() はオブジェクト ポインターを破棄しますか?
オブジェクト ポインターのベクトルを扱う場合、その動作を理解することが重要です保存されたオブジェクトに対する Vector::erase() の。この記事では、この問題を調査し、オブジェクトの整合性を維持するための解決策を提供します。
Vector::erase() は、デストラクターを呼び出してベクターから要素を削除します。含まれているオブジェクトが生のポインターの場合、vector::erase() は参照オブジェクトの破棄の所有権を取得しません。
ポインターのベクター内の参照オブジェクトを明示的に破棄するには、それぞれのオブジェクトに対して手動で delete を呼び出す必要があります。含まれているポインタ。たとえば、次のコード スニペットは、ポインターのベクトルの内容をクリアする方法を示しています。
<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 など) を使用してオブジェクトを適切に破棄することです。
ファンクターとテンプレートを使用したエレガントなソリューション
汎用エレガントな代替案は、ベクトル内のポインターを削除するためにファンクターとテンプレートを使用することです。以下に包括的な例を示します。
<code class="cpp">class DeleteVector { public: bool operator()(T x) const { // Delete pointer. delete x; return true; } };
このファンクターを std::for_each() と組み合わせて使用すると、ベクトルを反復処理し、含まれるポインターを削除できます。たとえば、次のコードは、DeleteVector ファンクターを使用して、myclass ポインターのベクターの内容を削除する方法を示しています。
<code class="cpp">for_each( myclassVector.begin(),myclassVector.end(), DeleteVector<myclass*>());</code>
このアプローチを利用すると、心配することなく、ベクター内の参照オブジェクトをシームレスに削除できます。オブジェクトのライフサイクル管理または潜在的なメモリ リークについて。
以上が`Vector::erase()` はオブジェクト ポインタを自動的に破棄しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。