如何正确地删除双精度数组通过指针后,指针已被迭代



我用下面的代码创建了一个双精度数组:

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;

最新更新