2D массив указателей: удаление массива, но не указателей?

#c #arrays #pointers #memory-management #heap-memory

#c #массивы #указатели #управление памятью #куча-память

Вопрос:

В моем коде у меня есть 2D массив указателей на мои данные:

 Data***
 

Причина, по которой я не использую нотацию массива, заключается в том, что размер не определяется во время компиляции.
Итак, где-то в моем коде я выделяю все необходимое пространство:

 arr = new Data **[xVals];
for (int i = 0; i < xVals; i  )
{
    arr[i] = new Data *[yVals];
    for (int j = 0; j < yVals; j  )
    {
        arr[i][j] = nullptr;
    }
}
 

А затем заполните массив моими правильными указателями некоторое время спустя.
Кроме того, указатель также сохраняется в std::vector :

 for(...) {
    for(...) {
        // Conditional statement; not the whole array gets filled, some parts stay nullptr
        ...
        arr[xCoord][yCoord] = new Data(...);
        myVector.push_back(arr[xCoord][yCoord]);
    }
}
... // Do some other stuff that takes advantage of the spatial properties of the 2D array
 

Как только я закончу использовать 2D массив, я хочу удалить его, но НЕ удалять сами указатели данных, поскольку они теперь хранятся в моем векторе.
Я пробовал следующее:

 for (int i = 0; i < xVals; i  )
{
    // Delete all "column" arrays
    delete[] arr[i];
}
// Delete 
delete[] arr;
 

Однако я получаю ошибку поврежденной кучи CRT detected that the application wrote to memory after end of heap buffer , поэтому я не уверен, что именно я там сделал неправильно. Как мне удалить 2D массив без удаления содержащихся в нем данных?

Комментарии:

1. Тот, кто проголосовал за закрытие вопроса буквально через секунду после того, как я его опубликовал, не мог бы объяснить, почему? Я не думаю, что это нарушает правила, и при этом секунды не должно было быть достаточно, чтобы действительно прочитать сообщение.

2. То, что при удалении материала вы получили сообщение о повреждении кучи, не означает, что удаление вызвало повреждение. Вероятно, повреждение произошло ранее в коде, который вы нам не показали, и было обнаружено только при выполнении удаления. На самом деле это обычное дело. Ваш код удаления выглядит нормально для меня, проблема где-то в другом месте.

3. @john Ах, я вижу, это имеет смысл. Я думал, что, поскольку MSVC указал на мою ошибку при удалении, они были причиной этого.

4. Если вы не можете определить проблему, начните удалять код. Когда вы удаляете строку кода и ошибка исчезает, то, вероятно , это строка кода, которая вызывает повреждение.

5. Не пишите new и delete сами. Просто не делайте этого, на самом деле. В этом нет необходимости. std::vector работает. Используйте его.