从全局向量中移除元素的生命周期

时间:2012-10-16 13:55:35

标签: c++ variables member lifetime

我基本上有一个

vector<Object> vec_; 

作为cpp类中的类成员。在某个类函数中,这个向量将用“Objects”填充,如下所示:

vec_.push_back(Object());

稍后我迭代向量元素并保持指向最佳元素的指针。然后清除向量,如下所示:

Object* o_ptr = &(vec_[0]);
for (unsigned int i = 1;  i < vec_.size(); i++) {
  if (o_ptr->getCost() > vec_[i].getCost()) {
  o_ptr = &(vec_[i]);
} 

vec_.clear();

现在我的问题是:从矢量中删除的对象会发生什么?一旦它们从矢量中移除,它们的寿命就会结束吗?那么指针也指向空白区域吗? 如果不是,这些物体的寿命何时结束?

问候scr

4 个答案:

答案 0 :(得分:3)

当调用vector.clear()时(或vector被破坏时)vector中包含的所有对象都将被破坏(在这种情况下,它们是对象而不是原始指针),将o_ptr留作悬空指针。

请注意,即使没有调用vector,在clear()中缓存元素的地址(或迭代器)也是危险的。例如,push_back()可能导致vector的内部重新分配,从而使缓存的地址(或迭代器)无效。

答案 1 :(得分:1)

跟踪对象生命周期的最佳方法是向构造函数和析构函数添加printf。

class MyObject
{
public:
    MyObject()
    {
        printf("MyObject constructed, this=%p\n", this);
    }
    ~MyObject()
    {
        printf("MyObject destructed, this=%p\n", this);
    }
};

答案 2 :(得分:1)

  

从矢量中删除的对象会发生什么?

它们被破坏了。

  

一旦从矢量中移除它们,它们的寿命就会过去吗?

  

指针是否也指向空白区域?

是的。如果要保存对象,请在清除向量之前复制它。

同样重要的是要注意某些向量操作可能会使指针指向任何内容,即使向量未被清除。具体调整大小,通常涉及重新分配。通常最好通过索引存储对向量元素的引用,因为您始终能够通过索引获取元素(而某些操作后指针可能无效)。

应用于向量的下标运算符返回引用但不进行复制。

答案 3 :(得分:1)

对象归向量所有,而.clear()确实会删除它们。

此外,指向存储在std::vector中的对象有点危险。如果将新元素推送到向量,则某些向量可能需要分配更多内存 - 可能会使用其复制构造函数将所有先前元素复制到不同的地址(从而使指针无效)。

所以:使用带std::vector的整数索引而不是指针,除非你知道你不会超出预留容量(你可以保证使用.reserve())。

(同样在我们处理时,请确保不要将向量的内部缓冲区大小与.size()混淆,这只是存储的实际元素的数量。)