2011-07-16 67 views
1

我創建使用下面的代碼雙打的數組:如何在指針迭代後通過指針正確刪除雙精度數組?

double *points = new double[(ii+1)*(jj+1)*(kk+1)*3]; 

我認識到,爲了刪除的磁盤陣列,所有我需要做的就是:

delete[] points; 

然而,該陣列在如下通過第一元件的地址的功能(稱爲create_points)創建的:

return &points[0]; 

穿過地址調用該函數然後迭代的代碼:

double *address = create_points(x_dim,y_dim,z_dim); 
for(int k=0; k<x_dim+1; ++k) 
    for(int j=0; j<y_dim+1; ++j) 
     for(int i=0; i<z_dim+1; ++i) { 
      v[p_count].x = *address; 
      ++address; 
      v[p_count].y = *address; 
      ++address; 
      v[p_count].z = *address; 
      ++address; 
      ++p_count; 
     } 

現在我問題是,如何正確刪除用於訪問地址的雙精度數組?我可以簡單地去delete[] address,還是我必須以其他方式做到這一點?

回答

5

你不能說delete[] address,這樣做是未定義的行爲。你必須通過一個指向數組的原始基地址的指針來刪除它。因此,如果您要增加指針,您需要記住原始指針(或重新計算它):

double *base_address = create_points(...); 
double *address = base_address; 
// do stuff with address, increment it, etc. 
delete [] base_address 
+0

好吧,這是有道理的。謝謝! –

+1

或者根本不返回指針,但返回某種形式的智能指針,以確保它被刪除? –

1

您必須給出正確的地址。地址位於分配區域內是不夠的。 爲什麼不在開始迭代之前保留指針的副本? &points[0] == points

1

它只是定義的行爲來刪除您分配的內容,這將是通過create_points返回的地址。最好的方法是迭代臨時。

double *address = create_points(x_dim,y_dim,z_dim); 
double *a = address; 
for(int k=0; k<x_dim+1; ++k) 
    for(int j=0; j<y_dim+1; ++j) 
     for(int i=0; i<z_dim+1; ++i) { 
      v[p_count].x = *a; 
      ++a; 
      v[p_count].y = *a; 
      ++a; 
      v[p_count].z = *a; 
      ++a; 
      ++p_count; 
     } 
delete[] address;