2014-03-31 101 views
1

如何在這種情況下正確釋放內存?如何在這種情況下正確釋放內存

我不明白爲什麼Valgrind的寫道:我有:

「條件跳轉或移動依賴於未初始化值(S)」

這是主要功能:

int n=0; 
cin >> n; 
float* matrix; 

matrix = new float [ n * 3 ]; 

for(int i = 0; i < n; i++) { 
    for(int j = 0; j < 3; j++) { 
     cin >> *(matrix + i * 3 + j); 
    } 
} 

int* array_of_numbers_of_circles = findIntersection(matrix,n); 

for(int i = 0; i < n; i++) { 
    for(int j = 0; j < 2; j++) { 
     if(*(array_of_numbers_of_circles + i * 2 + j) != 0) { //it writes error in if; 
      cout << *(array_of_numbers_of_circles + i * 2 + j) << " "; 
     } 
    } 
    if(*(array_of_numbers_of_circles + i * 2 + 0) != 0 && 

    *(array_of_numbers_of_circles + i * 2 + 1) != 0) { //it writes error in if here too; 
     cout << "\n"; 
    } 
} 

delete[] matrix; 
delete[] array_of_numbers_of_circles; 

和功能:

int* findIntersection(float matrix[], int n) { 
//some variables 

int* array_of_numbers_of_circles; 

array_of_numbers_of_circles = new int [ n * 2 ]; 

for(int i = 0; i < n; i++) { 
    for(int j = i + 1; j < n; j++) { 
     //some code here 


     *(array_of_numbers_of_circles + i * 2 + 0) = i + 1; 
     *(array_of_numbers_of_circles + i * 2 + 1) = j + 1; 

    } 
} 

return array_of_numbers_of_circles; 

} 

有什麼問題?我不明白爲什麼VALGRIND會說這樣的錯誤

先謝謝您了!

+0

使用std :: vector自動刪除內存並檢查緩衝區溢出。 –

+0

你確定,這裏的「一些代碼」不包含一些'continue'或'break'語句嗎?我的觀點是 - 是否100%確定,'array_of_numbers_of_circles'的_all_元素是_really_initialized?你也可以用調試器來檢查它。 –

+1

爲什麼使用'*(矩陣+我* 3 + j)'而不是更常見和簡單的'矩陣[i * 3 + j]'? – HEKTO

回答

5

首先,警告「條件跳轉或移動取決於未初始化的值」與您是否正確釋放內存無關。

您不初始化array_of_numbers_of_circles的所有元素。

當外循環中i == n-1時,內循環執行0次。因此索引2 * n - 22 * n - 1中的元素未被初始化。但是,它們用於main,在行if(*(array_of_numbers_of_circles + i * 2 + j) != 0)

根據//some code here中的內容,該數組可能還有其他元素未被初始化。

+0

//這裏的一些代碼意味着只有代碼行我檢查smth,如果它是正確的,我這樣做*(array_of_numbers_of_circles + i * 2 + 0)= i + 1; *(array_of_numbers_of_circles + i * 2 + 1)= j + 1; –

1

正如錯誤消息提示的那樣,這可能是因爲Valgrind認爲您在初始化它們之前以某種方式使用了值。嘗試使用Valgrind標誌來告訴你未初始化值的來源在哪裏。

回答您的原題「在這種情況下如何正確釋放內存?」,我強烈建議你切換到使用std::vectorstd::auto_ptr來使你的代碼更加可靠和健壯。

+0

+1。我不明白爲什麼人們堅持扔C指針,C風格,沒有迫切的需要。 – DevSolar

相關問題