【问题标题】:Can pointers to items in other classes/structures be safely used?可以安全地使用指向其他类/结构中的项目的指针吗?
【发布时间】:2014-02-03 18:29:37
【问题描述】:

我有一个相当复杂的场景,所以我试图将其提炼为基本问题。

我有 3 个类(这里简化了):

class Base {
protected:
    std::map <unsigned int, Node*> nodes;
}

class Node {
protected:
    std::map <unsigned int, Leaf*> leaves;
}

class Leaf {
protected:
    myDataStruct myData;
}

这些类代表一个 3 级树,由一个基、std::map&lt;int,ptr*&gt; 中的一些中间节点和每个节点的一些叶子组成,也作为 std::map&lt;int,ptr*&gt;。此树在更新线程中动态生成和更新。

我有另一个线程从这些节点渲染数据,其速度比更新慢得多,因此我更喜欢将更新操作与渲染分开。我也不会在渲染线程的每个循环上渲染所有数据。

我最初的想法是通过调用存储指向叶子中数据的指针的函数来注册我想从叶子中渲染数据:

void MyRenderClass::registerData(int* dataPointer) {
    // store dataPointer in MyRenderClass
    myStoredDataPointer = dataPointer;
}

然后在渲染线程循环期间,我使用该数据指针来渲染数据。

所以,问题是:这样安全吗?我可以通过在各自的析构函数中取消注册数据来处理叶或节点被删除的情况。我真正想知道的是,该指针是否会在树更新以及添加新节点和叶子时保持不变? std::map 是否会在修改时重新排列或移动指针?

在相关说明中,我可以安全地将指向父节点/基的指针存储在叶/节点中,以便我可以从叶->基遍历树吗?

我希望这是有道理的。起初我认为这似乎没问题,但我想在进一步走这条路之前进行验证。这个例子有点做作,因为整个代码库太大而无法理解。

【问题讨论】:

    标签: c++ multithreading pointers stdmap


    【解决方案1】:

    这里的重要问题是:

    std::map 会在修改后重新排列或移动指针吗?

    std::map 保证只要该对象仍在映射中,迭代器、引用和指向其对象的指针将保持有效。所以你可以安全地存储一个指针,只要你不删除它指向的对象。

    请注意,并非所有容器都提供此保证;例如,vector 将在超出其容量时移动其元素并且必须分配新的内存块,以便将元素保持在连续数组中。 (但即便如此,如果您正在存储指针,那么它们指向的对象也不会移动)。

    【讨论】:

    • 这是我以为我理解的,但我很紧张,尤其是当我的一些项目没有渲染时。我想我还有更多的调试要做......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多