2013-03-12 179 views
0

所以這裏是我遇到的問題。指向std :: vector

我有一個指向std :: vector的指針。所以在初始化指針之後,我不會向矢量添加任何項目,也不會刪除任何項目。然而,在我的代碼中的某個點,我的std :: vector移動了位置,最後我得到了一個懸掛指針。這似乎是隨機發生的,儘管我在製作指針之後從未觸摸過這個矢量。我花了一段時間調試了這個,以解決這個問題。有沒有辦法保證我的std :: vector不會改變內存位置?或者是否有一個指向矢量的指針是個不錯的主意。

+0

請張貼一些代碼並解釋您在調試過程中發現的內容。 std :: vector移動似乎不太可能。相反,指針會更改爲指向無效的內存位置。爲了幫助您找出原因,我們需要更多信息。 – 2013-03-12 18:44:21

+2

你有一個指向'std :: vector'的指針,還是你有一個指向'std :: vector'內的元素的指針? – Caesar 2013-03-12 18:44:22

+0

介意顯示一些代碼?你爲什麼要使用指向矢量的指針?它可以用矢量矢量來代替嗎? – taocp 2013-03-12 18:45:30

回答

1

或者它只是一個壞主意有一個指向矢量的指針?

一般來說,我認爲使用原始指針來控制對象的生命週期是一個壞主意。不要使用原始指針和自動內存管理,請嘗試使用具有適當所有權語義的智能指針(std::shared_ptr<>std::unique_ptr<>)。使用原始指針僅用於觀察指針(如果您希望能夠在運行時驗證它們是否懸掛,請使用weak_ptr<>)。

此外,在許多情況下,您可能會意識到您根本不需要指針。在這種情況下,只需使用一個帶有自動存儲的對象,由於移動語義,這個對象可以高效地在C++ 11中移動或傳遞/返回值。

1

這似乎發生隨機

不,不。只要它保持在範圍內,它具有相同的地址。可能發生的情況是矢量超出了範圍,並且由於它被自動分配(聽起來像),它在那個時候被破壞。你可以做的是在堆上分配的載體(例如int S):

std::vector<int>* pv = new std::vector<int>(); 

然後,你將不會有這個問題。然而,你必須記住pv超出範圍,否則你會得到一個內存泄漏之前

delete vp; 

明確delete它。