【问题标题】:How to have valid references to objects owned by containers that dynamically move their objects?如何对动态移动对象的容器拥有的对象进行有效引用?
【发布时间】:2021-07-29 12:34:45
【问题描述】:

如果您有一个指向容器中包含的对象的指针或引用,例如动态数组或哈希表/映射,则存在对象不会永久保留在那里的问题,因此似乎对这些对象的任何引用对象很快就会失效。例如,动态数组可能需要重新分配,而哈希表可能需要重新哈希,从而改变数组中存储桶的位置。

在像 Java(我认为是 C#)这样的语言中,可能是大多数语言,这可能不是问题。在这些语言中,很多东西都是引用而不是对象本身。您可以创建对动态数组的第三个元素的引用,基本上通过将引用复制到位于其他地方的对象来创建新引用。

但是在 C++ 中,动态数组或哈希表实际上会将对象直接存储在容器拥有的内存中,你应该怎么做?我创建的对象只有一个可以存在的地方。我可以通过在某处分配对象来创建对象,然后将指向该对象的指针存储在动态数组或哈希表或任何其他容器中。但是,如果我决定让容器成为这些对象的所有者,我会遇到指针或引用这些对象的问题。

对于像 std::vector 这样的动态数组,您可以使用索引而不是内存地址来引用数组中的对象。如果数组被重新分配,索引仍然有效。但是,如果我删除数组中的一个元素,我会遇到同样的问题,那么索引可能不再有效。

在哈希表之类的情况下,该表可能会动态重新哈希,从而更改存储桶中所有值的位置。每次您想要访问它时,引用哈希表值的唯一方法是搜索或哈希键吗?

有哪些方法可以引用这些容器或其他容器中的对象?

【问题讨论】:

    标签: pointers reference dangling-pointer


    【解决方案1】:

    对此没有任何神奇或常用的解决方案。你必须做出权衡。如果您在这个低级别优化事物,一个好的方法可能是使用一个容器类,它会在它进行重新分配时通知您。看看是否有任何具有此属性的容器库会很有趣

    【讨论】:

    • 这似乎是一个难题。它还必须在删除或插入时通知我。然后我需要寻找对这些元素的所有引用,这意味着我必须将它们全部记录下来?嗯,不知道是怎么处理的。
    • 记录,或者您的代码可能会知道您的数据结构以及需要更新的内容。现在确定您对删除和插入的含义,您已经知道何时删除元素。而插入时,只需要获取添加元素的地址即可。
    猜你喜欢
    • 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
    相关资源
    最近更新 更多