首頁  >  文章  >  後端開發  >  在 C 中從向量中刪除指標是否會破壞引用的物件?

在 C 中從向量中刪除指標是否會破壞引用的物件?

Susan Sarandon
Susan Sarandon原創
2024-10-30 19:58:03489瀏覽

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

從指標向量中刪除物件會破壞物件本身嗎?

處理指向物件的指標向量時,了解以下內容很重要:使用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
}

使用共享指標的替代方法

對於更優雅和通用的解決方案,請考慮使用boost ::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中文網其他相關文章!

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