我基本上有一个
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
答案 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()
混淆,这只是存储的实际元素的数量。)