【问题标题】:C++ Will use of pointers in vectors potentially cause dangling pointers?C++ 在向量中使用指针是否会导致悬空指针?
【发布时间】: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 总是更好吗?

【问题讨论】:

  • "我想知道这是否会导致问题" - 在本例中,不会,除非您稍后访问 ab 之后的 vector 元素,和 c 超出范围,使 vector 持有的指针无效。
  • 向量重新分配不会导致悬空指针。导致悬空指针的唯一原因是指针的寿命比它指向的东西长。向量与此无关。
  • vector 将保持这些值,即使它增长或缩小。如果您确保向量中的所有指针都指向与向量一样长的内存,那么您就可以了。
  • 我认为您对另一个问题感到困惑,如果您有指向向量中元素的指针,那么向量重新分配会使这些指针无效,但上面的代码中并非如此。
  • 如果向量拥有其中的项目(因此负责在这些对象的生命周期结束时删除它们),向量应该是vector&lt;unique_ptr&lt;Thing&gt;&gt;

标签: c++ pointers vector memory-management


【解决方案1】:

这很好

Thing t0, t1;
vector<Thing*> v;
v.push_back(&t0);
v.push_back(&t1);

即使第二个push_back 导致重新分配v[0] 仍将指向t0

这样不好

Thing t0, t1;
vector<Thing> v;
v.push_back(t0);
Thing* tp = &v[0];
v.push_back(t1);

这里第二个push_back 可能会使tp 指针无效,因为tp 指向向量的内部,如果发生重新分配,它将被删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2012-07-23
    • 2018-01-23
    • 2011-04-24
    • 2020-10-28
    • 2019-09-10
    • 1970-01-01
    相关资源
    最近更新 更多