Как правильно удалить массив значений типа double с помощью указателя после его итерации? - PullRequest
1 голос
/ 16 июля 2011

Я создал массив пар, используя следующий код:

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, или я должен сделать это другим способом?

Ответы [ 3 ]

5 голосов
/ 16 июля 2011

Вы не можете сказать delete[] address, так как это неопределенное поведение.Вы должны удалить его через указатель на исходный базовый адрес массива.Итак, если вы собираетесь увеличивать указатель, вам нужно запомнить исходный указатель (или пересчитать его):

double *base_address = create_points(...);
double *address = base_address;
// do stuff with address, increment it, etc.
delete [] base_address
1 голос
/ 16 июля 2011

Это только определенное поведение для удаления того, что вы выделили, и это будет адрес, возвращаемый через 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;
1 голос
/ 16 июля 2011

Вы должны дать правильный адрес. Недостаточно, чтобы адрес находился в выделенном регионе. Почему бы не сохранить копию указателя до начала итерации? &points[0] == points

...