gpt4 book ai didi

c++ - 指向 vector 项的指针——在 Windows 上

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:23:37 27 4
gpt4 key购买 nike

我有以下类(class):

class A {};

class B { vector<A> vect; };

我可以像这样访问任意 A:

A a = b.vect[0];
// A *a_ptr = &a;

但是我怎样才能直接到达 *a_ptr 呢?

A *a_ptr = &b.vet[0];

编译并没有给出运行时错误,但它指向错误的内存位置。

编辑:

我的真实世界示例:http://ideone.com/kP8NK

虽然 Ideone 给出了预期的“You are now at 0, 0, 0”,但 MS VisualStudio 编译器给出了“You are now at 6624656, -33686019, -1414812757 "

最佳答案

这不是“错误”,您只是错过了不同之处。即:

A a = b.vect[0]; // Makes `a` a *copy* of the vector element
A *a_ptr = &a; // Address of the copy

A *a_ptr2 = &b.vect[0]; // Address of the element, not a copy

要获得等效性,您应该将第一个更改为:

A& a = b.vect[0]; // Makes `a` a reference to the vector element
A *a_ptr = &a; // Address of the element, not a copy

如果在观察到这种差异后您仍然没有得到预期的结果,那么您需要向我们展示您的确切示例,以及您如何确定“正确”和“错误”的结果。


问题是 std::vector<>::push_back size() == capacity() 时将使对元素的引用、指针和迭代器无效,因为它需要分配一 block 新的内存。使用无效指针(等)会导致未定义的行为,因此您的结果是未知的。

您应该改为存储索引,并进行简单的查找以获取实际元素。 (注意 vector 保持有序,因此即使您的房间可能在内存中移动,它们的索引也是相同的。)

关于c++ - 指向 vector 项的指针——在 Windows 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6150570/

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