2012-01-21 337 views
0
for(k=i; k<MAXRECORDS; k++) { 
    if(slist->servers_ptr[k+1] != NULL) { 
     slist->servers_ptr[k] = slist->servers_ptr[k+1]; 
    } else slist->servers_ptr[k] = NULL; 
} 

當我跑Valgrind的,我得到無效的大小爲8內存泄漏

的錯誤我想這已經是與邊界情況在我的for循環,但我不」從邏輯上理解它是如何發生的。

編輯:有人指出,在for循環的最後一輪,訪問servers_ptr [k + 1]是數組之外,導致valgrind錯誤。我已經更新我的代碼:

for(k=i; k<MAXRECORDS-1; k++) { 
     if(slist->servers_ptr[k+1] != NULL) { 
       slist->servers_ptr[k] = slist->servers_ptr[k+1]; 
       if(k==MAXRECORDS-2)slist->servers_ptr[k+1] = NULL; 
     } else slist->servers_ptr[k] = NULL; 
} 

我仍然在valgrind中得到錯誤。我錯誤地更新了嗎?

+0

MAXRECORDS = 10,並且slist-> servers_ptr []的大小是MAXRECORDS –

+0

這不是內存泄漏,Valgrind消息告訴您正在覆蓋或超出分配內存的邊界(在您的情況數組中) –

+0

Did你聲明'servers_ptr'爲'servers_ptr [MAXRECORDS + 1]'?否則,當'k = MAXRECORDS-1'時,您正在讀取結尾。 –

回答

3

這幾乎肯定是因爲你超越了數組的末尾。 k的最大值是MAXRECORDS-1,您在表達式中使用的是k+1

這意味着您將訪問array[MAXRECORDS]索引應限制在0MAXRECORDS - 1(含)之間。

這是很難看到你想要什麼沒有更多的情況下做的,但如使用k < MAXRECORDS - 1作爲for循環持續的條件(在中間位)修復可以是簡單:

for (k = i; k < MAXRECORDS - 1; k++) { 

其他可能性是i的無效值,例如-1,這會導致陣列另一端出現問題。這可能不太可能,因爲我假設您通過將所有其他元素向下移動來刪除元素i(如:i將設置爲有效索引)。


這不是一個內存順便說一下,一個簡單的內存損壞泄漏。內存泄漏是當你分配內存,然後失去了指向他們,讓他們永遠不能被釋放,是這樣的:

char *x; 
for (i = 0; i < 10; i++) 
    x = malloc (64); 

,其中僅最後分配訪問。


順便說一句,如果一個洗牌的缺失是你以後,它會做得更好(在我看來)爲:

// For every element where there's a non-NULL next element, 
// shift that element down. Then force the last element to 
// be NULL (it will have been shifted down already). 

for (k = i; (k < MAXRECORDS - 1) && (slist->servers_ptr[k+1] != NULL); k++) 
    slist->servers_ptr[k] = slist->servers_ptr[k+1]; 
slist->servers_ptr[k] = NULL; 

額外的條件停止下一個元素NULL並將NULL置於該位置。這應該可以正常工作,並且具有不那麼複雜的優點。

+0

這是更清潔,你是對的。好的解釋,我會給這個鏡頭。 –

2

基礎上for條件下,這看起來像一個錯誤:

if((slist->servers_ptr[k+1] != NULL) 

,因爲它會讀取過去servers_ptr數組的結尾。

將條件更改爲k < MAXRECORDS - 1

+0

謝謝:))我改變了for循環的條件,但我仍然得到錯誤:( –

3

如果slist->servers_ptr是大小爲MAXRECORDS的數組,則當k = MAXRECORDS - 1時訪問元件k+1將超出數組邊界。

由於0是數組的第一個元素,因此10是數組的元素。大小爲10的數組沒有第十一個元素。

+0

這是有道理的。謝謝! 我更新了for循環的界限,但仍然在valgrind中得到相同的問題。 –