使用 push_back() 时指针向量指向 NULL

Posted

技术标签:

【中文标题】使用 push_back() 时指针向量指向 NULL【英文标题】:Vector of pointer points to NULL when using push_back() 【发布时间】:2019-06-17 18:55:16 【问题描述】:

我的代码中有以下结构,它分配 x 和 y 随机生成的整数值:

struct A
    int x,y;
    A () : x(random_gen_num),y(random_gen_num) ;   
;

我有一个对象向量,需要一个指向每个对象的指针向量:

vector<A> a(5);
a.reserve(5);

vector<const A*> apoint(5);
apoint.reserve(5);
for(const A thisA : a)
    apoint.push_back(&thisA);

当我尝试使用以下方式打印它们时:

for(unsigned int i = 0; i<5; i++)
    cout<< i <<"\t"<< a[i].x <<"\t" << &a[i]<<"\t" << apoint[i] <<endl;

我将所有的 apoint 都设为 NULL 指针,如下所示:

0       8       0x29b1bd0       0
1       8       0x29b1bd8       0
2       1       0x29b1be0       0
3       8       0x29b1be8       0
4       6       0x29b1bf0       0

当我在 for 循环中说 apoint[i] = &amp;a[i] 时,代码对我来说似乎是合乎逻辑的,但实际上这是无效的,因为 apointa 的索引可能不一样。据我所知,我找不到类似问题的已回答问题。有没有更好的方法将指针插入向量?

【问题讨论】:

请提供minimal reproducible example, 您要解决的实际问题是什么?为什么你认为你需要一个指向另一个向量中对象的指针向量? 是的,不清楚为什么需要apoint。当您想要a 中的元素地址时,只需使用&amp;a[i],尽管我怀疑您甚至需要它 是的,需要一个指针向量,因为在实际程序中,我希望将其用于另一个函数进行评估。但是,谢谢。我没有考虑thisA的范围。 apoint 包含十个指针——五个空指针后跟五个悬空指针。 【参考方案1】:
vector<const A*> apoint(5);

创建一个vector 并用默认初始化的5 个const A*s 预加载它。这意味着apoint,在你之前push_back 任何东西都包含5 个空指针。由于大小已经是 5,apoint.reserve(5); 实际上什么都不做。这也适用于vector&lt;A&gt; a(5);

这意味着

for(unsigned int i = 0; i<5; i++)
    cout<< i <<"\t"<< a[i].x <<"\t" << &a[i]<<"\t" << apoint[i] <<endl;

打印出这 5 个空指针,然后再到达用 push_back 添加的五个空指针。改变

vector<const A*> apoint(5);

vector<const A*> apoint;

构造一个空的vector 或用apoint[index] = &amp;thisA; 分配给这5 个指针并删除Theapoint.reserve(5);`。

但是……

for(const A thisA : a)
    apoint.push_back(&thisA);

需要进一步分解才能发现第二个错误。 const A thisA : a 复制 a 中的元素,这些元素仅存在于 for 循环的单次迭代中。这些指针太短暂了,对你没有任何用处。您希望引用 a 中的值,而不是副本,所以

for(const A thisA : a)
    apoint.push_back(&thisA);

需要

for(const A & thisA : a)
    apoint.push_back(&thisA);

关于在vectors 中存储对项目的引用的说明:这通常是个坏主意。如果提出新问题并解释您的目标,我们可能会提出更好的替代方案。如果您确实需要指向 vector 元素的指针,请非常小心不要违反 Iterator invalidation rules 。

【讨论】:

【参考方案2】:
for(const A thisA : a)
    apoint.push_back(&thisA);

您推送的指针在下一个循环中不再有效。您需要参考 (A&amp;)。

当然,假设你真的需要一个指针向量(是吗?)

【讨论】:

以上是关于使用 push_back() 时指针向量指向 NULL的主要内容,如果未能解决你的问题,请参考以下文章

push_back 指向指针向量的指针

如何创建指向向量的指针向量

C ++如何使用指向向量指针的指针

指向向量的 C++ 指针

用向量 c++ 中的指针成员初始化对象

C ++从向量中删除指针会导致堆错误