0

下面的代碼是否包含內存泄漏。我懷疑它確實存在,但我用來檢測它們的工具(Visual Studio + Parasoft C++測試)沒有標記任何東西。如果是我如何解決它?這是否包含內存泄漏?

//A dynamically allocated array of char pointers 
int numOfStrings = 10, numOfChars = 32; 
char** data = new char*[numOfStrings]; 

//Generate each each individual string 
for(int i = 0; i <numOfStrings; i++) 
    data[i] = new char[numOfChars]; 

//moves the elements 1-5 in the array to the right by one 
int index = 1, boundary = 5, sizeToMove = (boundary - index) * sizeof(numOfChars); 
memmove(&data[index + 1],&data[index],sizeToMove); 

delete[] data; 

編輯:

我應該提,我都試過遍歷如下每個個體字符串,但發生異常。

for(int i = 0; i< numOfStrings; i++) 
    delete [] data [i]; 
+2

@NuclearGhost:不,它不應該。這個問題是關於識別和糾正一段代碼中的特定問題的。代碼審查適用於您有任何代碼需要改進的地方。 –

+0

請勿使用'new';最好使用'std :: vector',或者使用'char's,'std :: string'。 –

回答

1

是的,你有泄漏!

刪除指向它們的指針之前,您必須刪除數組中的每個指針。

//delete each array 
for(int i = 0; i <numOfStrings; i++) 
    delete[] data[i]; 

//this is a single pointer, not an array 
delete[] data; 

現在,你不會有泄漏

+0

這就是我原本以爲我應該做的事情,但是當我輸入for循環時會導致異常。 – user2211776

+0

我不明白你的第二個評論,你爲什麼改變了delete [] data;'delete'data;' - 是的,它是一個單獨的指針,而不是一個數組。你不要在數組上使用'delete'或'delete []',你可以在指針上使用它們。但它指向動態分配數組的第一個元素。 'char ** data = new char * [numOfStrings];' - 所以'delete [] data;'是正確的。 –

2

是它。當你刪除

delete[] data; 

您正在釋放分配給數據的存儲。然而,分配的內存

data[i] = new char[numOfChars]; 

仍未釋放。

在刪除數據之前,您必須遍歷data並刪除每個data[i]

通常你應該確保你有多少delete s作爲new s。
這裏您有numOfStrings + 1new s和只有一個delete

還有一漏

既然你是做

int index = 1, boundary = 5, sizeToMove = (boundary - index) * sizeof(numOfChars); 
memmove(&data[index + 1],&data[index],sizeToMove); 

(你不動轉向五個地方,你想,但4位(5 - 1 = 4)

此操作後

data[2] will get the value of data[1] 

data[2] <- data[1] 
data[3] <- data[2] 
data[4] <- data[3] 
data[5] <- data[4] 

什麼是data[5]指出將丟失。
data[2], data[1]將具有相同的值(指向同一個地方)

,當你想通過循環刪除了data

+0

我已經嘗試過這樣做,但會發生豁免。我已經用代碼更新了原始帖子。 – user2211776

+0

你應該在刪除'data'之前做到這一點 – 2013-04-01 19:18:31

+0

這就是我嘗試它時放置它的地方。這是第一次在循環中刪除[] data [i],導致我再次編輯了異常 – user2211776

1

的規則是這也可以解釋爲什麼你得到段錯誤:爲每一個「新',必須有相應的'刪除'呼叫。你沒有,所以你有泄漏。