gpt4 book ai didi

c++ - 指针实际上并不指向对象本身?

转载 作者:太空宇宙 更新时间:2023-11-04 15:51:43 25 4
gpt4 key购买 nike

我目前有一个类的 vector Foo和另一个指向 Foo 子集的指针 vector 在 vector 中。我目前有一个函数可以从 vector<Foo *> 中选择一些指针。并从 vector<Foo> 中删除它们实际上包含它们。因此,一开始,这两个 vector 看起来像这样:

//Foo classes in vector<Foo>
a
b
c
d

//Foo pointers in vector<Foo *>
*a
*b
*c
*d

但是,我发现在删除 Foo 之后,说 b ,它们看起来像这样:

//Foo classes in vector<Foo>
a
c
d

//Foo pointers in vector<Foo *>
*a
*c
*d
*d

指针怎么会指向cvector<Foo *>不会一直指向 cb 之后在 vector<Foo> 中被删除?有什么办法可以解决这个问题吗?

(我知道如果我删除 b ,指向 b 的原始指针将是悬空的;但是,由于我不打算在删除后访问 b,我认为它不会问题,我可以使用指向 c 的指针转到下一个索引)

编辑:

根据要求,填充指针 vector 的代码:

for(int i = 0; i < a.size(); i++) //a is the vector<Foo>
{
Foo * thisFoo = &a[i];
if(someConditionMet)
b.push_back(thisFoo); //b is the vector<Foo *>
}

最佳答案

vector 将其元素存储在数组中。数组是元素的连续序列。

如果您有一个包含元素 a、b、c、dvector 并删除元素 b,则元素 cd 在数组中向下移动一个索引以填充由删除的元素创建的空洞,留下一个包含 a, c, d 的数组。

指针在移动时不会“跟随”vector 中的元素。如果您有一个“指向 c”的指针,那么该指针实际上指向“数组中索引 2 处的元素”。当您从数组中删除 b 时,“索引 2 处的元素”就是 d,而不是 c

如果你想让一个对象有一个固定的地址永远不会改变,你应该自己动态分配它并使用智能指针跟踪它(比如unique_ptrshared_ptr) .

关于c++ - 指针实际上并不指向对象本身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7135838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com