gpt4 book ai didi

C++ 和标准容器 : memory addresses of members

转载 作者:行者123 更新时间:2023-11-30 02:19:03 27 4
gpt4 key购买 nike

我目前在理解标准容器中的内存管理方面遇到了一些麻烦,尤其是 std::vector

我很清楚,如果没有足够的空间保留,std::vector 将在向其添加元素后调整大小,因此移动每个元素并更改内存中的地址。我现在的问题是:元素的成员变量发生了什么?

我的问题是基于这样的想法,即对于我的游戏引擎,我目前正在 std::vector 中管理场景。场景由 Scene 管理器类管理,该管理器类包含 Scenestd::vector。添加场景如下所示:

    std::vector<Scene> scenes;
Scene* active;
...
Scene scene;
scenes.emplace_back(scene);
active = &scenes.back();

场景是栈分配的,离开方法后会被丢弃。为了将当前添加的场景暴露给外部,我存储了一个指向 std::vector 后面的指针,这是新插入的元素。

Scene 包含各种成员,例如 Light 类的实例。出于各种原因,我还向外部公开了指向这些元素的指针。我的问题是我试图在 Scene 的构造函数中使用这些指针,这些指针是在 Scene 管理器中构造的。将对象添加到 std::vector 后,似乎构建了一个新对象,即使似乎没有调用 Scene 构造函数。 “事件”成员现在包含与我之前分配的实际 Scene 对象不同的内存地址。由于 vector 需要调整大小,我很清楚这一点。

但是场景中的成员会怎样呢?原来的 Scene 将被破坏,事件元素获得另一个内存地址。这意味着它指向一个全新的元素,因为内部调整大小,并且该新元素有新成员,在我的例子中是我想要使用的成员。

我的理解正确吗?

我的第二个问题包括我应该如何处理这样的情况:我想公开指向存储在 std::vector 中且大小未知的对象成员的指针。我目前选择的方法工作得很好,但我不确定这是否是正确的方法:

Scene 类中有一个 onActivate 事件方法,它将在整个调整大小和获取 vector 的插入元素完成后调用。当我切换事件指针时,该方法也会被调用。该方法获取指向场景成员的指针并将它们四处传递。它看起来像这样:

void postConstruct() {
std::cout << "postConstruct: " << &el << std::endl;
}

并且将在 Scene 管理器中的正确位置调用,该管理器当前是 Scene 类的 friend 因为这些事件不应该暴露于外部世界。

    active->postConstruct();

这是正确的方法吗?

最佳答案

在调整 std::vector 大小的情况下,如果移动构造函数声明为 noexcept,则元素将使用元素的移动构造函数移动,否则将被复制使用元素的复制构造函数到新分配的位置。

重新分配后成员指针是否相同将取决于如何为插入的元素实现移动构造函数或复制构造函数。

我建议使用索引而不是 Scene* 来访问 std::vector 中的元素,或者如果需要,可以使用 std::list使用 Scene*

关于C++ 和标准容器 : memory addresses of members,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51284925/

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