ホームページ  >  記事  >  バックエンド開発  >  `vector::erase()` はポインタのベクトル内のオブジェクトを破棄しますか?

`vector::erase()` はポインタのベクトル内のオブジェクトを破棄しますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-30 02:07:28985ブラウズ

 Does `vector::erase()` Destroy Objects in a Vector of Pointers?

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 サイトの他の関連記事を参照してください。

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