Realloc创造了悬空指针?

时间:2016-07-14 23:07:22

标签: c++ pointers

我写了一些分配内存的数组代码,数组中的每个值都是一个类型。然后我有另一个数组,由第一个数组组成,用于引用。

两个阵列都可以增长。它使用realloc。因为第二个数组包含指向第一个数组的指针,所以当第一个数组发生更改时它们肯定不会更新(我不会手动执行并且没有GC)。当然第二个数组中的所有指针都是无效的! (他们指的是realloc免费提供的记忆)。

  1. 这是对的吗?

  2. 这似乎会使持久性指针指向可能移动非常危险的内存块?

  3. 标准解决方案是什么?不要使用" global"指针?使用指向指针的指针?我想我可以让第二阵列使用**并且可能会让事情发挥作用。

  4. 在MT环境中,情况更糟。可以在中间移动本地指针访问,然后更改内存,并且本地指针现在是错误的。 (当然,这可以通过锁定来防止移动等来解决......)

  5. 使用函数式编程?

2 个答案:

答案 0 :(得分:2)

是的,realloc可能会使您的引用无效。如果没有连续的空间来重新定位,则会移动阵列。 考虑使用容器作为std :: deque。

答案 1 :(得分:1)

  

1)这是对的吗?

  

2)这似乎会使持久性指针指向可能移动非常危险的内存块?

  

3)什么是标准解决方案?

您可以设计应用程序,以便明确定义对象的生命周期,以便在不再需要它们时不会引用它们。

  

4)在MT环境中,情况更糟。可以在中间移动本地指针访问,然后更改内存,并且本地指针现在是错误的。 (当然,这可以通过锁定等来阻止移动来解决......)

显然你永远不应该使用不再指向其资源的指针。在MT环境中管理共享资源并非易事,而且有很多工具和技术可以实现它。

  

5)进行函数式编程?

如果可以,建议尽量避免使用指针。

没有特定问题,很难给出具体的解决方案。但为了实现“不指向消失的资源”,我们有各种各样的工具可供使用。我们有智能指针,我们有容器,我们有值语义。我们需要了解如何使用所有这些,但我们还需要将设计生命周期作为主要考虑因素。

对象生命周期总是是一个重要因素。然而,一些语言(例如Java)通过提供“更安全”的环境来减轻糟糕的设计。另一方面,C++则不那么宽容。然而,它确实有一大堆复杂的工具来完成任务。这意味着更陡峭的学习曲线,但效率更高,控制更好。