ホームページ >バックエンド開発 >C++ >C でベクターからポインターを消去すると、参照されているオブジェクトが破壊されますか?

C でベクターからポインターを消去すると、参照されているオブジェクトが破壊されますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-30 19:58:03520ブラウズ

  Does Erasing Pointers from a Vector in C   Destroy the Referenced Objects?

ポインターのベクトルからオブジェクトを消去すると、オブジェクト自体が破壊されますか?

オブジェクトへのポインターのベクトルを処理する場合、 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。