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

标签 c++ pointers vector

我目前有一个类的 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/

相关文章:

c++ - 标准库方法的成员函数指针问题

c++ - LNK2019 在.cpp文件中调用静态成员的方法时出错

c++ - 给定一组字符和长度的排列

c - Malloc 指针参数失败

c++ - cmake CMakeLists.txt 文件中的 CXX 中的 "XX"是什么

c - 大尾数法和小尾数法有点困惑

c++ - CX0030 : Error: Expression cannot be evaluated

c++ - 多项式++ : How to increment p(x) by 1

c++ - 旧 vector 是否被清除?如果是,如何以及何时?

r - 在某个值的向量中的位置,应用提到的位置从另一个向量中提取值