2016-05-12 90 views
0

我必須寫一個程序,其中,i使用動態陣列:刪除動態數組

int size=1; 
double* dyn_arr = new double[size]; 

int n=0; 
double sum=0.0; 
while(std::cin >> dyn_arr[n]){ 
    sum = sum + dyn_arr[n++]; 
    if(n==size){ 
     size*=2; 
     double* new_array = new double[size]; 
     std::copy(dyn_arr, dyn_arr + n, new_array); 
     delete[] dyn_arr; 
     dyn_arr = new_array; 
    } 
} 

我無法理解的部分dyn_arr = new_arraydelete[] dyn_arr之後。 dyn_arr是數組dyn_arr的第一個元素上的指針,不是嗎?我如何刪除指針/數組並再次寫入dyn_arr = new_array

+0

我不知道我明白你在問什麼。看起來你展示瞭如何在代碼中做點什麼,然後問如何去做。嗯..用你展示的代碼。是否有一些代碼的功能不理解?在delete [] dyn_arr之後的 –

+0

,dyn_arr指向的數組被釋放,dyn_arr是一個懸掛指針。你可以重新分配給這個指針,例如'nullptr'或指向另一個有效地址的指針,比如'new_array' – BeyelerStudios

+0

謝謝你,那就是問題所在。我在理論部分看到它,但我想再次要求確認。 – Susliks

回答

4

dyn_arr變量是一個「指向double的指針」類型的變量。這意味着它擁有雙倍的地址,您可以隨時更改它指向的雙倍。現在

double* dyn_arr = new double[size]; 

dyn_arr分第一的雙打size

double* new_array = new double[size]; 

這創建類型「指向double」指向第一雙打的新陣列的一個新的變量。

delete[] dyn_arr; 

這將刪除指向dyn_arr指向的數組。由於我們從new[]得到了dyn_arr的值,所以當我們完成數組時,我們可以將它傳遞給delete[]。所以現在dyn_arr指向垃圾,我們不能使用它的值。

dyn_arr = new_array; 

這改變的dyn_arr的值,使之指向新盤雙打中,我們分配了。由於dyn_arr是指針類型的變量,我們可以隨時將其更改爲指向不同的東西。

1

new_array是在if語句中創建的新動態數組。有問題的行將刪除原始數組,然後將dyn_array指定爲指向新數組。

delete[] dyn_arr;  // <--- Delete the old array. 
dyn_arr = new_array; // <--- Point dyn_arr at the newly allocated array. 
3
delete[] dyn_arr; 

你不是 「刪除指針」。你正在「刪除」它用來指向的內存。現在它沒有指向任何東西。這是懸而未決的。

dyn_arr = new_array; 

現在您將指針指向新的內存塊,而不是。