0

我基本上有一个

vector<Object> vec_; 

作为 cpp 类中的类成员。在某个类函数中,这个向量将被“对象”填充,就像这样:

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();

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

问候

4

4 回答 4

3

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

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

于 2012-10-16T13:57:52.910 回答
1

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

class MyObject
{
public:
    MyObject()
    {
        printf("MyObject constructed, this=%p\n", this);
    }
    ~MyObject()
    {
        printf("MyObject destructed, this=%p\n", this);
    }
};
于 2012-10-16T14:00:35.953 回答
1

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

他们被摧毁了。

一旦它们从向量中移除,它们的生命周期就结束了吗?

是的。

那么指针是否也指向空白空间?

是的,它确实。如果要保存对象,请在清除矢量之前对其进行复制。

同样重要的是要注意,即使未清除向量,某些向量操作也可能使指针指向空。特别是调整大小,这通常涉及重新分配。通常最好通过索引存储对向量元素的引用,因为您将始终能够通过索引获取元素(而指针可能在某些操作后失效)。

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

于 2012-10-16T14:02:05.093 回答
1

对象归向量所有,并且.clear()确实将它们删除。

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

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

(另外,当我们这样做时,请确保不要将向量的内部缓冲区大小与 混淆.size(),后者只是存储的实际元素的数量)。

于 2012-10-16T14:03:04.973 回答