|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
14.05.2019, 09:50 | #1 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,646
|
От куда оператор delete берет размер массива, чтобы освободить всю память, которая была выделена под массив?
Возник вот какой вопрос. Допустим, пользователь задает число элементов и мы создаем массив динамически:
Код:
Код:
Код:
Код:
E-Mail: arigato.freelance@gmail.com
|
14.05.2019, 10:41 | #2 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
погуглил. на stackoverflow много про это.
короче. a - это не массив, это указатель. delete знает, сколько выделено памяти (берёт из соответствующей структуры). по нормальному нужно в C++ использовать std:vector() вместо указателя на массив. как хакерский вариант, есть такое решение: Цитата:
Так что, передавайте n и не парьтесь! |
|
14.05.2019, 15:08 | #3 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,646
|
Получается, что размер массива фактически находится как бы в -1 элементе. Чем-то напоминает паскалевские строки, где размер строки хранится в нулевом символе. Странно, что нет стандартной функции определения размера массива, если это можно сделать достаточно просто и это делается при вызове delete.
E-Mail: arigato.freelance@gmail.com
|
14.05.2019, 15:14 | #4 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
В С++ лучше использовать подходящий контейнер, а не так.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
15.05.2019, 00:42 | #5 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Это уходит корнями еще в С - там тоже отсутствуют средства получения размера выделенного блока. Далеко не всегда нужно знать размер, а если стандарт будет вас заставлять его хранить, то это уже лишний overhead.
Соответственно new/delete выкручиваются сами как могут, но стандарт опять же не заставляет их хранить размер именно в -1 элементе. Компилятор волен использовать любую другую схему. Скорость - наше все. Если вы пишете на С++ и используете напрямую new, delete и * то значит у вас (большие) проблемы. |
22.05.2019, 13:25 | #6 | |
Заблокирован
Регистрация: 17.12.2018
Сообщений: 514
|
Цитата:
Последний раз редактировалось taras-proger77; 22.05.2019 в 18:22. |
|
03.06.2019, 01:06 | #7 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,646
|
Со статическими массивами можно узнать размер. Но если массив передать в функцию (а передаются они как указатели), то размер уже не узнать:
Код:
E-Mail: arigato.freelance@gmail.com
|
03.06.2019, 14:11 | #8 | |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Цитата:
Формально в С++ 11 можно сделать шаблонную функцию/метод куда будет передаваться ссылка на массив с размером, но это только для статических массивов. Строго говоря, в С/С++ нет массивов, все делается через указатели, т.е. размер нужно передавать самому. Квадратные скобки это скорее выделение памяти. |
|
03.06.2019, 15:29 | #9 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,646
|
Это комментарий к примеру кода ниже.
Вопрос темы не в том, нужно или нет передавать размер, а в том, что оператор delete [] сам узнает размер, ему ничего передавать не надо. E-Mail: arigato.freelance@gmail.com
|
04.06.2019, 12:24 | #10 |
Пользователь
Регистрация: 21.06.2016
Сообщений: 65
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как освободить память от типа Audio? | reyn90 | Общие вопросы .NET | 6 | 26.12.2015 23:21 |
Освободить память формы | st_yak | C++ Builder | 0 | 21.12.2013 19:56 |
Проверить выделена ли память под объект | Sibedir | Общие вопросы Delphi | 58 | 21.03.2011 11:48 |
Освободить память от CEdit | Eros | Общие вопросы C/C++ | 0 | 29.11.2010 15:37 |
Неправильно выделена память. С++ | Purr | Помощь студентам | 7 | 31.10.2010 20:05 |