2012-03-28 84 views
1

這是我的代碼:C++指針 「錯誤:雙重釋放或腐敗(出)」

uint16_t * ptemparr = new uint16_t[20]; 
for (int x=0;x<2;x++) 
{ 
    function(ptemparr); 
    ptemparr ++; 

} 
delete[] ptemparr; 

當我這樣做,我得到這個錯誤:

double free or corruption (out) 

編輯: 謝謝我明白爲什麼我會得到這個錯誤,現在你認爲這是一個更好的主意嗎?

uint16_t temparr[20]; 
uint16_t * ptemparr = temparr; 
for (int x=0;x<2;x++) 
{ 
    function(ptemparr); 
    ptemparr ++; 

} 

這樣我就把指針放在堆棧上,並且沒有內存泄漏問題。 此外,該代碼上面有跑每1秒,所以請記住你讓我知道什麼是造成這種狀況

+0

爲什麼你不使用括號進行索引? – tartar 2012-03-28 05:00:43

+0

funtion在ptemparr中返回一個數組,上面的代碼僅僅用於說明目的,++實際上是一個ptemparr = ptemparr + 4 – Kam 2012-03-28 05:03:53

+0

@Kam,如果你總是分配x(x = 20代碼片段),那麼你最好使用靜態分配,即使每秒一次「很少」,靜態分配和動態分配之間的差異在時間上會消失。然後,使用堆棧或堆是一個有趣的問題:如果該向量需要在塊外部訪問,堆是強制性的。 – Enzo 2017-11-14 08:28:14

回答

4

您需要將相同的地址傳遞給它被new []返回delete []最好的編碼實踐之前這個裸露。
此外,確保function()不會deallocate the memory by calling delete'on傳遞的指針。

+0

我更新了我的問題:) – Kam 2012-03-28 05:01:04

+0

@Kam:是的,第二種方法更好。在C++中避免動態分配總是一個好主意。事實上,最好的C++代碼最少使用'new'.And所有,從來沒有與生指針。 – 2012-03-28 05:03:38

0

您需要將ptemparr重置爲其家庭地址,因爲您在for循環中增加了它。所以,我建議在刪除它之前減2。

ptemparr-=2;

+0

太笨重了。 – 2012-03-28 04:54:39

+0

@JonathonReinhart確實clunky ==不正確? – Kiril 2012-03-28 04:56:05

+0

不,它會起作用,但難以維護,只是要求未來的錯誤。 – 2012-03-28 04:57:49

0

您需要deletenew返回相同的地址。

我總是讓我的循環在原始指針的副本上排成一行,並且永遠不要修改由mallocnew返回的原始指針。

相關問題