首页  >  文章  >  后端开发  >  在 C 中从向量中删除指针是否会破坏引用的对象?

在 C 中从向量中删除指针是否会破坏引用的对象?

Susan Sarandon
Susan Sarandon原创
2024-10-30 19:58:03432浏览

  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