Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.96/76: Рейтинг темы: голосов - 76, средняя оценка - 4.96
46 / 46 / 5
Регистрация: 28.07.2009
Сообщений: 144
1

Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a?

22.12.2009, 16:23. Показов 14340. Ответов 41
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Скажем я в какой-то момент выделяю память под массив:
C++
1
int *a = new int [n];
затем память может изменяться как-то и конечный размер мне не известен.
Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.12.2009, 16:23
Ответы с готовыми решениями:

Удаление памяти, на которую ссылается указатель
Всем привет. Такой вопрос, что станет с указателем на объект, если этот объект удалить через...

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

Размер выделенной динамической памяти больше чем ожидается
der operator+(char *x) //obj + строка { der newObj; int y=strlen(_name)+strlen(x)+1; ...

Как добавить новой динамической памяти к уже выделенной
Добрый вечер! У меня есть следующий вопрос: Допустим я выделил для некоторой строки память char...

41
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
22.02.2014, 22:41 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
Но как это отменяет то, что средств нет?
я к тому что
Цитата Сообщение от DrOffset Посмотреть сообщение
нестандартных нет.
нестандартные то как раз есть, но это грязный хак
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
22.02.2014, 22:43 22
Цитата Сообщение от ValeryS Посмотреть сообщение
нестандартные то как раз есть, но это грязный хак
Может быть мы по-разному понимаем слово "средства". Но я бы никогда не назвал UB - средством, разве что средством нажить себе проблемы. Под средством я подразумевал нормально работающее в пределах заданной платформы решение. Примером такого решения является упомянутый уже _msize. Для new аналогичных решений - нет.
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
22.02.2014, 22:58 23
Цитата Сообщение от DrOffset Посмотреть сообщение
Для new аналогичных решений - нет.
есть но так скажем полумеры
sizeof прекрасно возвращает размер структуры
стоит обернуть массив в структуру и можем получить размер, но размер фиксированный во время работы менять нельзя, посему и полумеры
ну это так
разговор ушел в сторону, кто еще как может
посему прекращаю дозволенные речи
а вообще самое лучшее таскать размер с собой, 4 байта не великая нагрузка, зато избавит от кучи головняков

Добавлено через 2 минуты
а пример забыл привести
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct aaa
{
char a[100];
};
 
 
int main(int argc, char * argv [])
{
 
aaa* b=new aaa;
int s1=sizeof(*b);// 100
return 0;
}
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
22.02.2014, 23:20 24
Цитата Сообщение от ValeryS Посмотреть сообщение
но так скажем полумеры
Не хотел ничего возражать, но тут есть очевидная проблема - выравнивание.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
23.02.2014, 00:11 25
Цитата Сообщение от DrOffset Посмотреть сообщение
Не хотел ничего возражать, но тут есть очевидная проблема - выравнивание.
Не спорю есть
но оно отключается настройками компилятора
Пускай об этом голова болит у тех кто хочет чесать левой рукой правое ухо
весь мир пользуется перетаскиванием размера, весь ДииректИкс на этом построен, а здесь виш ли
Цитата Сообщение от JamesBlack Посмотреть сообщение
Мне нужно каждый раз запоминать, сколько я памяти выделял??? А по другому никак?
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
23.02.2014, 00:24 26
Цитата Сообщение от ValeryS Посмотреть сообщение
но оно отключается настройками компилятора
Я разрабатывал программы под платформы, где отключение выравнивания переводило железку в бесконечный ребут. Потому что обращение по не выровненным адресам вызывало аппаратное исключение.
Я понимаю, что ты щас скажешь, что это маленький процент. Но я уже не могу игнорировать этот факт, т.к. лично с ним сталкивался.
0
38 / 38 / 22
Регистрация: 16.04.2013
Сообщений: 327
Записей в блоге: 1
23.02.2014, 00:33 27
спецом протестил _msize().
находится в конио, работает прекрасно.
зачем тратить память на инт, если вот оно решение.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
23.02.2014, 00:36 28
Цитата Сообщение от DrOffset Посмотреть сообщение
Я понимаю, что ты щас скажешь,
Да не скажу
Я полностью на твоей стороне
а примеры приводил, чтобы показать что пути есть и какие там есть "подводные камни"
чтобы не вылез какой нибудь ученик с "А я знаю как"

Добавлено через 2 минуты
Цитата Сообщение от Miwa123 Посмотреть сообщение
спецом протестил _msize().
пользуй кто тебе мешает
только потом не говори что не предупреждали, когда будешь компилить на другом компиляторе ибо
Цитата Сообщение от Croessmah Посмотреть сообщение
это не стандартная приблуда
1
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
23.02.2014, 00:38 29
Цитата Сообщение от Miwa123 Посмотреть сообщение
спецом протестил _msize().
Да юзай на здоровье. Только имей в виду, что при смене компилятора, версии рантайма, операционной системы _msize примененный для памяти выделенной через new может сломаться. А может и не сломаться.
Если ты пишешь для себя - это пофигу. Если работаешь в команде, а проект потом начнут портировать на другую платформу, или юзер вашей программы обновит себе ОС или рантайм, то могут начаться непредсказуемые проблемы.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
23.02.2014, 00:54 30
Цитата Сообщение от Miwa123 Посмотреть сообщение
находится в конио, работает прекрасно.
а MSDN говорит что в <malloc.h>
http://msdn.microsoft.com/ru-r... 077bc.aspx
и это сугубо про студию
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
23.02.2014, 00:57 31
Цитата Сообщение от Croessmah Посмотреть сообщение
а MSDN говорит что в <malloc.h>
В mingw - там же.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
23.02.2014, 01:13 32
В RAD Studio XE3 http://docwiki.embarcadero.com... 3/en/Msize
malloc.h
_msize returns the size of the allocated heap block whose address is block. The block must have been allocated with malloc, calloc, or realloc. The returned size can be larger than the number of bytes originally requested when the block was allocated.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
23.02.2014, 01:19 33
Под Linux есть альтернатива:
C++
1
size_t malloc_usable_size (void *ptr);
The value returned by malloc_usable_size() may be greater than the
requested size
of the allocation because of alignment and minimum
size constraints. Although the excess bytes can be overwritten by
the application without ill effects, this is not good programming
practice: the number of excess bytes in an allocation depends on the
underlying implementation.

The main use of this function is for debugging and introspection.
0
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 42
25.02.2014, 16:45 34
Цитата Сообщение от DrOffset Посмотреть сообщение
int _msize(void* memory)
Нельзя использовать для памяти выделенной через new.
чушь! Все можно.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
25.02.2014, 16:55 35
Цитата Сообщение от FinancialShark Посмотреть сообщение
чушь! Все можно.
Такие резкие утверждения принято подкреплять доказательствами. Я вот свое могу:
The _msize function returns the size, in bytes, of the memory block allocated by a call to calloc, malloc, or realloc.
Если оператор new будет реализован через malloc, то тогда это будет работать. В случае другой реализации - могут быть проблемы. Что это означает? Это означает, что в общем случае нельзя полагаться на _msize в случае если память выделена через new.
0
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 42
26.02.2014, 01:42 36
Цитата Сообщение от DrOffset Посмотреть сообщение
Если оператор new будет реализован через malloc, то тогда это будет работать. В случае другой реализации - могут быть проблемы. Что это означает? Это означает, что в общем случае нельзя полагаться на _msize в случае если память выделена через new
И как по вашему работает оператор "new" если не секрет??? и что значит если оператор "new" выделит память не через "malloc" а через что???

Добавлено через 15 минут
new/delete это тот же malloc/free только new помимо выделения памяти еще инициализирует обект, а delete вызывает дуструктор!
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
26.02.2014, 02:17 37
Цитата Сообщение от FinancialShark Посмотреть сообщение
И как по вашему работает оператор "new" если не секрет??? и что значит если оператор "new" выделит память не через "malloc" а через что???
Во-первых оператор new можно перегружать. Про кастомные аллокаторы ведь в курсе? А то ведь там за new и пул памяти может скрываться.

Во-вторых ни стандартом, ни какой-то конкретной реализацией не гарантируется, что new будет обязательно реализован через malloc. Не гарантируется даже в пределах одной реализации, достаточно сменить release сборку на debug и компилятор будет генерировать совсем другие вызовы, с другой сервисной информацией о выделенной памяти. Нормальный разработчик должен это учитывать при принятии решений.
0
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 42
26.02.2014, 02:53 38
если не умеешь ездить на машине это не значит что она не работает!
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
26.02.2014, 09:58 39
FinancialShark, в любом случае отслеживание кол-ва выделенной памяти нет в стандарте, все остальное непереносимые кривые костыли, пользоваться или нет решает разработчик, а раз новичек спрашивает - нечего его сбивать с пути - пусть руководствуется стандартом, иначе потом вырастают рукожопы
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
26.02.2014, 13:01 40
Добавлено через 12 секунд
Цитата Сообщение от FinancialShark Посмотреть сообщение
если не умеешь ездить на машине это не значит что она не работает!
Цитата Сообщение от DrOffset Посмотреть сообщение
Нормальный разработчик должен это учитывать при принятии решений.
Давай я тебе расшифрую. Нормальный разработчик при принятии решений должен учитывать побочные эффекты. От этого в конце концов зависит его зарплата. Это означает, что если я водитель, то я могу ездить без фар или ремня безопасности, если хочу, но это не означает, что это безопасно. Т.е. я, водитель, оценил ситуацию и принял решение, ага - щас можно! Однако в автошколе учат чему? Правильно, общему случаю, и ГИБДД штрафует по чему? Правильно, по тому же общему случаю. Потому что не всякая частная ситуация применима в общем случае. И на 1 безопасный проезд без фар может оказаться 3 с аварией (а может и нет, но профи должен рассмотреть все варианты).
0
26.02.2014, 13:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2014, 13:01
Помогаю со студенческими работами здесь

Откуда берется значение указателя после удаления памяти на которую он ссылается?
Всем привет. Почему при удалении памяти указатель еще работает? Пример программы: #include...

Как уменьшить размер выделенной памяти
Доброе утро! пишет: переопределение формального параметра &quot;text&quot; :( подскажите пожалуйста как...

Как обнулить указатель на одну ячейку в динамически-выделенной памяти?
Выделю память под 10 элементов: int* p = new int; Наполняю значениями: for(int i = 0; i&lt;10; i++)...

Получить адрес памяти, на который ссылается указатель
Изучаю указатели, появился такой вопрос: int *b = new int(5); Как получить адрес памяти, на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru