2013-08-17 50 views
-2
istream& operator>>(istream& in,hhh& hh){ 

    double *arr,*temp; 
    int i=0; 
    char c; 
    c=in.peek(); 
    while(c!='\n'){ 
     if(i>=1){ 
      temp=new double[++i]; 
      for(int j=0;j<i-1;j++){ 
       temp[j]=arr[j]; 
      } 
      arr=temp; 
     } 
     else { 
      arr=new double[++i]; 
     } 
     in>>arr[i-1]; 
     c=in.peek(); 
    } 
    hh.set(arr,i); 
    delete [] arr; 
    return in; 
} 

我有內存泄漏嗎?我試圖弄清楚我有沒有但我不確定,謝謝你的幫助。C++我有內存泄漏嗎?

+0

你這樣做。在寫'arr = temp;'之前,首先你必須'delete [] arr;'。 (另外,初始化'temp'和'arr'爲'nullptr',這樣你就可以安全地'刪除']它們了。) – 2013-08-17 11:53:38

+0

瞭解如何使用'std :: vector '。 – milleniumbug

回答

0

是的,你有。

當您創建較大的數組時,您不會刪除較小的數組。

double* arr = 0; 
int size = 0; 
for (char c = in.peek(); c != '\n'; c = in.peek()) { 
    double* temp = new double[++size]; 
    // memcpy(temp, arr, (size - 1) * sizeof(double)); 
    for (int i = 0; i != size - 1; ++i){ 
     temp[i] = arr[i]; 
    } 
    delete [] arr; 
    arr = temp; 
    in >> arr[i-1]; 
} 

或更好,使用std ::矢量<雙> ARR;

std::vector<double> arr; 
for (char c = in.peek(); c != '\n'; c = in.peek()) { 
    double d; 
    in >> d; 
    arr.push_back(d); 
} 
+1

'for(int i = 0; i!= size - 1; ++ i)'當size = 0時出錯。使用'i

+0

爲什麼你評論// memcpy(temp,arr,(size - 1)* sizeof(double));? –

+0

@MatsPetersson大小之前遞增,並且不能爲0 – Jarod42

0

是的,你可以。在作業arr=temp;中,您覆蓋舊指針而不釋放它。我會建議不要使用原始指針。請使用std::unique_ptr<double[]>來包裝你的指針。它會保證你不會泄漏。

例子:

std::unique_ptr<double[]> arr, temp; 

arr.reset(new double[++i]); // in C++14 you would use std::make_unique instead 
+0

所以,當我指出arr = temp,然後刪除[] arr,temp被刪除,因爲arr指向temp,這是否正確? –

+0

@MikeL差不多,是的 –