2013-08-17 2 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'에 초기화하여 안전하게'삭제 '할 수 있습니다.) –

+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::vector<double> arr; 
for (char c = in.peek(); c != '\n'; c = in.peek()) { 
    double d; 
    in >> d; 
    arr.push_back(d); 
} 
+1

size = 0 일 때'for (int i = 0; i! = size - 1; ++ i)'가 잘못되었습니다. 대신'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을 삭제하면 arr이 temp를 가리키기 때문에 temp가 삭제됩니다. 맞습니까? –

+0

@MikeL pretty, yes –

관련 문제