ポインターのベクトルからオブジェクトを消去すると、オブジェクト自体が破壊されますか?
オブジェクトへのポインターのベクトルを処理する場合、 Erase() 関数の使用による影響。 Erase() はベクターから要素を削除し、そのデストラクターを呼び出しますが、参照されたオブジェクトは自動的に破棄されません。
ベクター内のオブジェクト ポインターの影響
オブジェクト ポインターのコンテキストでは、erase() はベクターからポインターを切り離すだけであり、基礎となるオブジェクトを破棄する所有権は取得しません。リソースを適切に管理するには、各ポインターに対して明示的に delete を呼び出して、参照されているオブジェクトを削除する必要があります。
ポインターを安全に消去するための推奨アプローチ
ポインターとそのポインターを安全に消去するにはベクトルから関連付けられたオブジェクトを取得するには、次のアプローチを使用できます。
<code class="cpp">void clearVectorContents(std::vector<YourClass*> &a) { for (int i = 0; i < a.size(); i++) { delete a[i]; // Delete the object pointed to by each pointer } a.clear(); // Remove pointers from the vector }
シェアード ポインターを使用した代替アプローチ
よりエレガントで汎用的なソリューションの場合は、ブーストの使用を検討してください。 ::shared_ptr。共有ポインタはリソースの所有権と削除を自動的に管理し、ポインタのベクトルをより安全かつ簡単に処理できるようにします。
テンプレートとファンクタを使用した拡張ソリューション
この改善されたソリューションでは、テンプレートとファンクタを使用します。ポインターの削除プロセスを簡素化するファンクター:
<code class="cpp">template<class T> class DeleteVector { public: // Delete pointer bool operator()(T x) const { delete x; return true; } };</code>
使用法:
<code class="cpp">for_each(myclassVector.begin(), myclassVector.end(), DeleteVector<myclass*>());</code>
コード例
次の例は、強化されたソリューション:
<code class="cpp">#include <functional> #include <vector> #include <algorithm> #include <iostream> // Your class class myclass { public: int i; myclass(): i(10) {} }; int main() { // Vector of pointers to myclass objects std::vector<myclass*> myclassVector; // Add objects to vector for (int i = 0; i < 10; ++i) myclassVector.push_back(new myclass); // Print initial vector contents for (auto& obj : myclassVector) std::cout << " " << obj->i; // Delete vector contents using enhanced solution for_each(myclassVector.begin(), myclassVector.end(), DeleteVector<myclass*>()); // Clear vector myclassVector.clear(); // Print vector size after deletion std::cout << "\n" << myclassVector.size(); return 0; }</code>
これらのアプローチを利用すると、適切なリソース管理とオブジェクトの破棄を確保しながら、オブジェクト ポインターを含むベクターから要素を安全に削除できます。
以上がC でベクターからポインターを消去すると、参照されているオブジェクトが破壊されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。