首页 > 后端开发 > C++ > 正文

`vector::erase()` 是否会销毁指针向量中的对象?

Linda Hamilton
发布: 2024-10-30 02:07:28
原创
985 人浏览过

 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!