首頁  >  文章  >  後端開發  >  `vector::erase()` 是否會銷毀指標向量中的物件?

`vector::erase()` 是否會銷毀指標向量中的物件?

Linda Hamilton
Linda Hamilton原創
2024-10-30 02:07:28987瀏覽

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

Vector::Erase 會破壞指標向量中的物件嗎?

處理包含物件指標的向量時,使用向量擦除元素::erase() 引發了對所指向物件的命運的擔憂。雖然 vector::erase() 從向量中刪除元素,但它不會自動銷毀實際物件。

Vector::Erase 的行為

Vector::擦除()從向量中刪除元素,但不擁有銷毀物件的所有權。但是,如果包含的物件是原始指針,則 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn