首页  >  文章  >  后端开发  >  `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::擦除()从向量中删除元素,但不拥有销毁对象的所有权。但是,如果包含的对象是原始指针,则 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