【发布时间】:2020-09-07 09:54:48
【问题描述】:
class Thing {
public:
Thing();
void dosomething(int i);
};
Thing::Thing() {};
void Thing::dosomething(int i) {
std::cout << i << "\n";
};
std::vector<Thing*> thingsList;
Thing a = {};
Thing b = {};
Thing c = {};
thingsList.push_back(&a);
thingsList.push_back(&b);
thingsList.push_back(&c);
thingsList[0]->dosomething(2);
上面的代码可以编译并为我工作。但我想知道它是否会导致问题。考虑向量随着向量的增长/收缩而重新分配其内存数组。当向量动态重新分配时,您是否有可能最终得到悬空指针?还是向量能解决这个问题?
使用 unique_ptr 总是更好吗?
【问题讨论】:
-
"我想知道这是否会导致问题" - 在本例中,不会,除非您稍后访问
a、b之后的vector元素,和c超出范围,使vector持有的指针无效。 -
向量重新分配不会导致悬空指针。导致悬空指针的唯一原因是指针的寿命比它指向的东西长。向量与此无关。
-
vector将保持这些值,即使它增长或缩小。如果您确保向量中的所有指针都指向与向量一样长的内存,那么您就可以了。 -
我认为您对另一个问题感到困惑,如果您有指向向量中元素的指针,那么向量重新分配会使这些指针无效,但上面的代码中并非如此。
-
如果向量拥有其中的项目(因此负责在这些对象的生命周期结束时删除它们),向量应该是
vector<unique_ptr<Thing>>。
标签: c++ pointers vector memory-management