在C++中将vector<pointer*>从一个复制到另一个

6

我创建了一个向量A,并希望通过以下方法将其复制到另一个类中的向量B,这样做是否正确?向量A可能会被销毁!我在Google上搜索了一下,但没有找到好的解决方案和有意义的解释。谢谢大家。

void  StateInit(vector<CButton*> listBtn) 
{ 
   _m_pListBtn = listBtn; 
 };

是的,看起来没问题...只要记住两个指针可以指向同一个对象。 - Beta
最好写成void StateInit(const vector<CButton*>& listBtn)这样的函数。现在的写法会将向量复制两次,一次是复制到listBtn,另一次是复制到_m_pListBtn。这样做没有意义。 - john
@john和Beta,然而向量A将来可能会被销毁,当我们在B中访问它时,会产生空指针异常吗?如果不会,我猜是因为我们执行了“_m_pListBtn = listBtn;”,它只是将listBtn中的所有元素复制到_m_pListBtn中,而不是将向量A的指针复制到向量B中???我是C++的新手,对一些愚蠢的问题感到抱歉^^ - Hien Nguyen
vector listBtn是否只是Vector A的一个副本?它只会指向Vector A中所有元素的地址吗? - Hien Nguyen
3
很简单。复制向量会复制指针。如果你在一个向量中销毁指针,就无法在另一个向量中使用该指针。但是,销毁向量并不会销毁指针。 - john
2个回答

9

是的和不是,您正在通过值传递向量:

void  StateInit(vector<CButton*> listBtn) 
{ 
   _m_pListBtn = listBtn; 
 };

这意味着listBtn是vector A的一个拷贝(假设我们正在调用StateInit函数中作为参数传递的那个vector),如果你删除了vector A,vector B仍将拥有指针集合,它们将是有效的,因为指针向量的销毁不会删除被指向的对象,因为它现在不知道应该如何处理(应该调用delete、delete[]、还是free?)。
请注意,如果你修改/删除vector A中的一个元素(使用向量上的指针),那么该元素将在vector B中被修改(因为它是指向相同元素的指针)。
我不确定你的意图是什么,但如果你想复制整个向量,你应该为对象实现克隆机制,然后使用transform将它们复制。
class cloneFunctor {
public:
    T* operator() (T* a) {
        return a->clone();
    }
}

然后只需要:
void  StateInit(vector<CButton*> listBtn) 
{ 
   transform(listBtn.begin(), listBtn.end(), back_inserter(_m_pListBtn), cloneFunctor()); 
 };

如果你的意图不是克隆它而是分享指针,你应该将向量作为指针或引用传递:

void StateInit(const vector<CButton*>& listBtn) 
{ 
   _m_pListBtn = listBtn; 
};

-3
更好的方法是迭代新向量并将元素push_back到您的向量中。
请参见示例代码:std::vector::begin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接