Как удалить динамический массив c
Перейти к содержимому

Как удалить динамический массив c

Как удалить динамический массив c

Кроме отдельных динамических объектов в языке C++ мы можем использовать динамические массивы. Для выделения памяти под динамический массив также используется оператор new , после которого в квадратных скобках указывается, сколько массив будет содержать объектов:

Причем в этом случае оператор new также возвращает указатель на объект типа int — первый элемент в созданном массиве.

В данном случае определяется массив из четырех элементов типа int, но каждый из них имеет неопределенное значение. Однако мы также можем инициализировать массив значениями:

В последнем случае при инициализации массива конкретными значениями следует учитывать, что если значений в фигурных скобках больше чем длина массива, то оператор new потерпит неудачу и не сможет создать массив. Если переданных значений, наоборот, меньше, то элементы, для которых не предоставлены значения, иницилизируются значением по умолчанию.

После создания динамического массива мы сможем с ним работать по полученному указателю, получать и изменять его элементы:

Для удаления динамического массива и освобождения его памяти применяется специальная форма оператора delete :

C++. Правильное удаление динамического двумерного массива

Всем привет. Я новичок в программировании и только начинаю многое осваивать(хотя и имею кое-какую подготовку, но считать её хоть сколь-либо серьезной смешно). Знакомлюсь с классами, пытаясь соорудить нечто для работы с матрицами. Код реализации не важен, важно то, что получаю ошибку: http://prntscr.com/e6y5on Ключевой вопрос в том, как её исправить.

При пошаговой проверке в Visual Studio программа сыплется на удалении внешнего указателя delete[] m_matrix; Собственно, прошу помочь =)

user avatar

Итак, у вас сразу выделяется память и создается матрица 1×1. Поскольку в конструкторе

у вас нет инициализации членов, они инициализированы по умолчанию этой матрицей.
Но что вы делаете дальше? Вы переписываете m_rows и m_cols , и в уже выделенный массив для ОДНОГО указателя записываете их m_rows , т.е. в данном конкретном случае — два.

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

Вот как по-хорошему должна выглядеть ваша матрица:

user avatar

Судя по всему вы создаёте int** m_matrix размером один, а потом передаёте параметр 2 и думаете что там 2 строки. Видимо вам лучше создавать динамичкский массив в методе Create:

В классе имеется обращение за пределы выделенной памяти. Если вы добавите следуюшие два предложения в конструктор

Нет никакого смысла инициализировать члены класса в определении класса вместо того, чтобы инициализировать их в конструкторе.

Имейте в виду, что вам необходимо также определить конструктор копирования и копирующий оператор присваивания, или определить их как удаленные.

Вы неправильно выделяете память. Эту строку:

необходимо перенести из заголовка ( .h ) в реализацию функции Create() :

В заголовке оставляете только объявление указателя:

Деструктор возвращаете к вашему первоначальному виду:

user avatar

Нашёл ответ на собственный вопрос. Не знаю дело ли в классе или же это так правильно, но удаления

Оказалось более чем достаточно.

user avatar

Всё ещё ищете ответ? Посмотрите другие вопросы с метками c++ массивы классы указатели или задайте свой вопрос.

Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.13.42356

Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Как правильно удалить динамический массив?

Я создал 3D-массив t динамически ( t имеет тип int*** ). Сейчас я пытаюсь удалить его.

Я натолкнулся на 2 предложения:
Во-первых, это просто сделать

и, видимо, это все удалит.

Другой, чтобы сделать что-то вроде

( t1 хранит размер t[i] а также t2 размер t[i][j] )

какой самый лучший способ?

Решение

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

Если вы распределили память таким образом, то память выглядит примерно так:

Теперь предположим, что вы просто пишете

Если вы сделаете это, то память будет выглядеть так:

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

С другой стороны, если вы используете версию кода удаления для цикла for-loop, вы в конечном итоге освобождаете всю память, потому что вы прошли все указатели и освободили каждый выделенный массив.

Вообще говоря, каждое распределение должно иметь соответствующее освобождение, поэтому, если вы позвонили new[] несколько раз вам нужно будет позвонить delete[] равное количество раз.

Как отмечалось в некоторых комментариях, возможно, есть более эффективные способы управления трехмерным массивом, чем использование int *** , Общая тенденция в C ++ — использовать объекты для максимально возможного автоматического управления памятью. Рассмотреть вопрос о повышении multi_array напишите или подумайте над тем, чтобы написать обертку вокруг std::vector который хранит записи в главном порядке строк.

Другие решения

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *