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

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

  • автор:

Удаление динамического массива

Author24 — интернет-сервис помощи студентам

Удаление динамического массива
есть динамический массив: double** Mas2 = new double*; for(int i=0;i<=kol2;i++) Mas2=new.

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

Удаление динамического массива
Доброго времени суток! Задача такова, что надо организовать бесконечный ввод в массив. Ввод.

Удаление динамического массива
Привет. Сделал программу с 3 динамическими массивами, но дело в том, что 2 из них, размер которых.

Регистрация: 03.03.2009
Сообщений: 18

При освобождении памяти из-под массива квадратные скобки обязательны, так как их отсутствие может привести к неопределенному поведению программы. А для освобождения памяти из-под одной переменной квадратные скобки не нужны. Операция delete [] выполняется медленее, чем delete . Это если память была выделена с помощью оператора new , а если память была выделена с помощью malloc, то память освобождают с помощью функции free.

Эксперт С++

2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465

Кроме того, что указал коллега FAT, прими еще во внимание, что для массивов нетривиальных классов delete [] вызывает деструкторы для каждого элемента массива, а delete — только для единственного. Если деструктор элемента отвечает за освобождение памяти, хэндлов или еще каких-то ресурсов, реализуя идиому RAII, последствия нетрудно предвидеть.
Да, и, конечно, delete вместо delete[] (равно как и наоборот) не только может привести к UB, но и — обязательно приведет. Другое дело, что это может проявится даааааалеко не сразу.

C++ Динамический массив. Удаление элемента

P.S.
То, что ты написал — это не С++, а просто С.

#3
16:05, 28 янв 2008

Почему нет? Можно удалить элемент, потом вручную сдвинуть все элементы с удаленной позиции на единицу. Примерно это же и будет делать std::vector, но удалять из середины массива (вектора) есть вселенское зло.

#4
16:18, 28 янв 2008

mirat
> Почему нет?
Потому, что исходный вопрос автора был «можно мне как-нибудь так хитро вызвать delete, чтобы массив сам сделал всё как надо ?»
И с этой позиции вариант
> Можно удалить элемент, потом вручную сдвинуть все элементы с удаленной позиции на единицу.
не катит.
Вот вектор — да, целостная сущность, обладающая нужным функционалом.

#5
16:30, 28 янв 2008

по поводу
стоимость операции удаления буде линейно зависить от кол-ва элементов?

#6
16:59, 28 янв 2008

HolyDel
Из середины да, из конца — константное время.

Nikopol
Не телепат, не знаю, что автор имел в виду 🙂

#7
17:03, 28 янв 2008

Все понятно. Всем спасибо

#8
17:17, 28 янв 2008

если удалять, то уж лучше std::list использовать.

#9
17:33, 28 янв 2008

замечу только что если порядок элементов в массиве не важен то делать своп с последним элементом + pop_back => константное время удаления

  • TaurenChief
  • Постоялец

#10
17:42, 28 янв 2008
#11
17:52, 28 янв 2008
#12
18:24, 28 янв 2008

JokerR
>замечу только что если порядок элементов в массиве не важен то делать своп с последним элементом + pop_back => константное время удаления

Но размер вектора не уменьшится (резервированный в памяти)

#13
19:18, 28 янв 2008

О. Федор
А что должен? Он у вектора не уменьшится в любом случае, кроме хака со swap’ом

#14
19:21, 28 янв 2008

вообще-то это implementation-depended

Как удалить динамический массив, возвращаемый функцией?

Она не принимает массив, но возвращает массив, созданный new. Как я понимаю, после возвращения массива, я теряю доступ к блоку памяти с массивом Array и не могу его удалить. Может быть понадобится функция удаления:

void delArray(unsigned short** Array, unsigned short raw) < for (unsigned short index = 0; index < raw; ++index) < delete[] Array[index]; >delete[] Array; > 

Функция в main:

#include #define Raw 12 #define Col 13 unsigned short** addArray(unsigned short raw, unsigned short col); void delArray(unsigned short** Array, unsigned short raw); int main(int argc, char* argv[]) < unsigned short** Arr = addArray(Raw, Col); delArray(Arr, Raw); _getch(); >unsigned short** addArray(unsigned short raw, unsigned short col) < unsigned short** Array = new unsigned short* [raw]; for (unsigned short index = 0; index < raw; ++index) < Array[index] = new unsigned short [col]; >return Array; > void delArray(unsigned short** Array, unsigned short raw) < for (unsigned short index = 0; index < raw; ++index) < delete[] Array[index]; >delete[] Array; > 

Было бы интересно узнать другие пути решения без заполнения памяти! Спасибо

Динамические массивы и переменные в C++: легко и просто!

обложка статьи

Всем привет! В этой статье мы создадим массив и переменные применяя указатели. Если вы еще не почитали прошлую (начальную) статью про указатели, то советуем сначала изучить ее. Ну а если вы это все знаете, то погнали!

Что такое динамические переменные

Динамические переменные — это переменные, которые созданы напрямую с помощью указателей. Для них существует функция удаление (это мы разберем ниже).

Чтобы мы могли полноценно создавать динамические переменные, нам понадобится изучить конструктор — new , после его использования в оперативной памяти

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

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