使用堆对象和销毁冲突浅层复制数据类型

时间:2012-07-27 06:54:29

标签: c++ destructor shallow-copy

我有以下数据类型:

class A{
public:
    A(){
    }
    ~A(){
        for(size_t i=0; i<b_elements.size(); i++)
            delete b_elements[i];
        b_elements.clear();
    }
    vector<B*> b_elements;
    //other operations ...
};

实施访问者设计模式以对A进行一些计算。

当我想仅处理b_elements的子集并将访问者专门应用于这些元素时,问题就开始了。

一种解决方案是创建另一个A对象,其b_elements指向原始对象中的所需元素,并在新创建的对象上调用访问者。但是(正如您所期望的)问题是当新对象被销毁时,析构函数将删除那些将影响原始对象作为副作用的引用。

提示:我无法使用所需的b_elements从原始对象创建副本,因为它太贵了。

我的问题是,这是一种常见的模式吗?什么是避免这种问题的最佳做法?

2 个答案:

答案 0 :(得分:2)

存储共享指针的向量:

class A{
public:
    A(){
    }
    vector<std::shared_ptr<B>> b_elements;
    //other operations ...
};

答案 1 :(得分:1)

或矢量的共享指针

class A{
public:
    A(){
    }
    std::shared_ptr< std::vector<B*> > b_elements;
    //other operations ...
};

使用这种方法,只有矢量将在末尾被销毁,而不是它的元素。