#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
работает. Используйте его.