2016-07-14 139 views
-4

我寫了一些分配內存的數組代碼,並且數組中的每個值都是一個類型。然後我有另一個數組,其中包含第一個數組的引用。Realloc創建懸掛指針?

這兩個數組都可以增長。它使用realloc。因爲第二個數組包含指向第一個的指針,所以當第一個數組更改時(我不手動執行並且沒有GC),它們肯定不會更新。當然,第二個數組中的所有指針都是無效的! (它們指向被realloc釋放的內存)。

  1. 這樣的情況是正確的嗎?

  2. 這似乎會使持久性指針指向可能移動非常危險的內存塊。

  3. 什麼是標準解決方案?不要使用「全局」指針?使用指針指向指針?我想我可以使第二個數組使用**,並可能可以使事情發揮作用。

  4. 在MT環境中,情況更糟。本地指針訪問可能會在中間移動,然後內存改變,並且本地指針現在是錯誤的。 (當然可以通過防止鎖等移動來解決...)

  5. 使用函數式編程?

+1

1.我覺得你有與數據結構的問題。 2.你爲什麼使用指針?也許智能指針。 –

+3

然後不要存儲指向第一個數組的指針。存儲索引。如果您的第一個數組只保持增長,這些將保持有效。 – PSkocik

+0

@PSkocik是的,但這並不總是解決方案。這在這種情況下起作用,因爲我使用了一個可索引數組。它沒有回答這個問題,只是試圖提供一個特定的解決方案(我已經做了一個解決方案,當我第一次寫代碼時,這是我最初的反應。但是我喜歡「嘿,int和void *佔用了同樣的空間,爲什麼不使用指針!」 ......然後很快意識到這是一個壞主意。 – AbstractDissonance

回答

2

是的,realloc可以使您的引用無效。如果沒有連續的空間來重新定位你的陣列將被移動。 考慮使用容器作爲std :: deque。

+0

僅供參考,標準容器參考(即迭代器)也將使用更改容器大小的操作失效。 –

+0

對於一個std :: vector和其他一些真的容器。但是一個std :: deque只會使線性插入的引用無效。 push_back和push_front不會使其迭代器失效。請參閱:http://en.cppreference.com/w/cpp/container/deque – rflobao

1

1)這種情況正確嗎?

是的。

2)這看起來好像會持續指向可能移動非常危險的內存塊嗎?

是的。

3)什麼是標準解決方案?

您可以設計您的應用程序,以便您的對象的生命週期得到良好的定義,以便在不再需要它們時不再引用它們。

4)在MT環境中,情況更糟。本地指針訪問可能會在中間移動,然後內存改變,並且本地指針現在是錯誤的。 (當然可以通過防止鎖等移動來解決)

顯然你不應該使用一個不再指向其資源的指針。在MT環境中管理共享資源不是微不足道的,有很多工具和技術可以實現它。

5)使用函數式編程?

它始終是可取的,如果你能避免指針。

沒有一個具體的問題,很難給出一個具體的解決方案。但爲了實現「不指向消失的資源」,我們有各種工具可供使用。我們有智能指針,我們有容器我們有值語義。我們需要了解如何使用所有這些,但我們也需要設計與對象終身記爲主要的考慮。

對象的生命時間應該始終是一個重要因素。但是一些語言(比如Java)通過提供一個「更安全」的環境來緩解不良設計。另一方面,C++則不那麼寬容。但是,它確實有一大堆用於該任務的複雜工具。這意味着更陡峭的學習曲線,但更有效率和更好的控制。