Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2015, 14:46   #1
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию delete []p

Код:
int *p;
p = new int[a];
delete []p;
ясно что во время компиляции, длинна массива ни известна.
Отсюда я делаю вывод, что она хранится где то в среде выполнения, ведь нужно знать сколько элементов удалить.
По чему, тогда нельзя вычислить длину массива? delete как то ее узнает
SAMOUCHKA вне форума Ответить с цитированием
Старый 21.09.2015, 14:58   #2
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

всё оно завязано на менеджере памяти, реализация которого зависит от компилятора, настроек, даже ОС, поэтому нет штатного способа получить размер выделенной памяти, а различные хаки будут работать только при определённых условиях

а знать точное количество занимаемой памяти совсем не обязательно....... например, менеджер памяти вполне может для больших объектов выделять отдельный блок памяти и потом его же удалять т. е. программе нужно 136 байт, а ей сразу 512 дали и пометили всю область как занятую (не особо эффективный алгоритм, но и такое может быть)
если почитать о менеджерах памяти, то там очень часто закладывают различные сценарии работы т. е., например, для мелких объектов используют одну схему распределения, для средних - другую, для больших могут применить описанный выше подход, чтоб не париться)

Последний раз редактировалось GreenWizard; 21.09.2015 в 15:11.
GreenWizard вне форума Ответить с цитированием
Старый 21.09.2015, 15:04   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

https://www.google.com/search?q=c%2B...+know+the+size


А вообще в C++ есть же и std::vector, и std::array, зачем самому создавать массив?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 21.09.2015, 15:31   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,085
По умолчанию

Цитата:
Сообщение от SAMOUCHKA Посмотреть сообщение
Код:
int *p;
p = new int[a];
delete []p;
ясно что во время компиляции, длинна массива ни известна.
Отсюда я делаю вывод, что она хранится где то в среде выполнения, ведь нужно знать сколько элементов удалить.
По чему, тогда нельзя вычислить длину массива? delete как то ее узнает
В плюсах изначально нет массивов как таковых, поэтому соответствующие методы программистам и не предоставляются.
Одна и та же запись может означать как один элемент по указателю, так и набор элементов. Причем этот набор не обязательно будет от начала выделенной памяти и до конца.
В общем, пишите себе как принято с передачей в функции указателя на элемент и максимального кол-ва элементов, иначе в один прекрасный день передадут указатель на третий элемент и функция поломается.
Если делать нормальный массив в языке, то там добавятся и функции и проверка на выход за границы и прочие радости, которые просадят производительность, что не будет соответствовать фишке плюсов.
pu4koff вне форума Ответить с цитированием
Старый 21.09.2015, 15:44   #5
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Спасибо в общих чертах понятно.

Значит эффективность выделения динамической памяти, да же от компилятора зависит? я думал что только от ОС.
SAMOUCHKA вне форума Ответить с цитированием
Старый 21.09.2015, 15:45   #6
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
В плюсах изначально нет массивов как таковых, поэтому соответствующие методы программистам и не предоставляются.
С чего бы нет-то? Всё ж есть.
Просто то, что у ТС, это не массив, а огрызок памяти.
Croessmah вне форума Ответить с цитированием
Старый 21.09.2015, 15:49   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,085
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
С чего бы нет-то? Всё ж есть.
Просто то, что у ТС, это не массив, а огрызок памяти.
На уровне языка нет массивов, равно как нет и строк. Библиотечные всякие array, vector,... есть, но у них и нет проблемы с числом элементов.
pu4koff вне форума Ответить с цитированием
Старый 21.09.2015, 15:57   #8
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
На уровне языка нет массивов, равно как нет и строк.
Раздел 8.3.4 стандарта даже называется Arrays.
Цитата:
In a declaration T D where D has the form
D1 [ constant-expression_opt] attribute-specifier-seq_opt
and the type of the identifier in the declaration T D1 is “derived-declarator-type-list T”, then the type of the identifier of D is an array type;
То бишь
Код:
int a[10];
как раз является массивом с точки зрения самого языка.
Croessmah вне форума Ответить с цитированием
Старый 21.09.2015, 16:00   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,085
По умолчанию

Как по мне, так это костыль, а не массив. На этапе компиляции там чего-то навертели, но не полноценный нормальный массив всё равно.
pu4koff вне форума Ответить с цитированием
Старый 21.09.2015, 16:05   #10
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Ну так вся его прелесть именно в compile-time std::array, тоже может быть реализован через него, но имеет уже функции-обертки.
Что касается std::vector, то здесь уже более сложная реализация.
Croessmah вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Python. В чем отличие Entry.delete(0, END) от Entry.delete(0.0, END) и еще вопрос pompiduskus PHP 4 12.08.2014 23:17
delete [] nazavrik Общие вопросы C/C++ 6 15.01.2010 22:46
error C2541: 'delete' : cannot delete objects that are not pointers novokhatsky Общие вопросы C/C++ 2 14.12.2009 10:25
Перегрузка операций new, new[], delete, delete[] IgorKr Общие вопросы C/C++ 1 22.10.2008 12:14