首页 > 解决方案 > 如何对动态移动对象的容器拥有的对象进行有效引用?

问题描述

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

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

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

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

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

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

标签: pointersreferencedangling-pointer

解决方案


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


推荐阅读