我用下面的代码创建了一个双精度数组:
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
,还是用别的方法?
您不能说delete[] address
,这样做是未定义的行为。你必须通过指向数组原始基址的指针来删除它。因此,如果您要增加指针,则需要记住原始指针(或重新计算它):
double *base_address = create_points(...);
double *address = base_address;
// do stuff with address, increment it, etc.
delete [] base_address
你必须给出正确的地址。地址位于分配的区域内是不够的。为什么不在开始迭代之前保存指针的副本呢?&points[0] == points
删除您分配的内容是唯一定义的行为,这将是通过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;