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

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

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

Студворк — интернет-сервис помощи студентам
Скажем я в какой-то момент выделяю память под массив:
C++
1
int *a = new int [n];
затем память может изменяться как-то и конечный размер мне не известен.
Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.12.2009, 16:23
Ответы с готовыми решениями:

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

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

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

41
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
22.02.2014, 22:41
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
Но как это отменяет то, что средств нет?
я к тому что
Цитата Сообщение от DrOffset Посмотреть сообщение
нестандартных нет.
нестандартные то как раз есть, но это грязный хак
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
22.02.2014, 22:43
Цитата Сообщение от ValeryS Посмотреть сообщение
нестандартные то как раз есть, но это грязный хак
Может быть мы по-разному понимаем слово "средства". Но я бы никогда не назвал UB - средством, разве что средством нажить себе проблемы. Под средством я подразумевал нормально работающее в пределах заданной платформы решение. Примером такого решения является упомянутый уже _msize. Для new аналогичных решений - нет.
1
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
22.02.2014, 22:58
Цитата Сообщение от 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
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
22.02.2014, 23:20
Цитата Сообщение от ValeryS Посмотреть сообщение
но так скажем полумеры
Не хотел ничего возражать, но тут есть очевидная проблема - выравнивание.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
23.02.2014, 00:11
Цитата Сообщение от DrOffset Посмотреть сообщение
Не хотел ничего возражать, но тут есть очевидная проблема - выравнивание.
Не спорю есть
но оно отключается настройками компилятора
Пускай об этом голова болит у тех кто хочет чесать левой рукой правое ухо
весь мир пользуется перетаскиванием размера, весь ДииректИкс на этом построен, а здесь виш ли
Цитата Сообщение от JamesBlack Посмотреть сообщение
Мне нужно каждый раз запоминать, сколько я памяти выделял??? А по другому никак?
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
23.02.2014, 00:24
Цитата Сообщение от ValeryS Посмотреть сообщение
но оно отключается настройками компилятора
Я разрабатывал программы под платформы, где отключение выравнивания переводило железку в бесконечный ребут. Потому что обращение по не выровненным адресам вызывало аппаратное исключение.
Я понимаю, что ты щас скажешь, что это маленький процент. Но я уже не могу игнорировать этот факт, т.к. лично с ним сталкивался.
0
38 / 38 / 22
Регистрация: 16.04.2013
Сообщений: 327
Записей в блоге: 1
23.02.2014, 00:33
спецом протестил _msize().
находится в конио, работает прекрасно.
зачем тратить память на инт, если вот оно решение.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
23.02.2014, 00:36
Цитата Сообщение от DrOffset Посмотреть сообщение
Я понимаю, что ты щас скажешь,
Да не скажу
Я полностью на твоей стороне
а примеры приводил, чтобы показать что пути есть и какие там есть "подводные камни"
чтобы не вылез какой нибудь ученик с "А я знаю как"

Добавлено через 2 минуты
Цитата Сообщение от Miwa123 Посмотреть сообщение
спецом протестил _msize().
пользуй кто тебе мешает
только потом не говори что не предупреждали, когда будешь компилить на другом компиляторе ибо
Цитата Сообщение от Croessmah Посмотреть сообщение
это не стандартная приблуда
1
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
23.02.2014, 00:38
Цитата Сообщение от Miwa123 Посмотреть сообщение
спецом протестил _msize().
Да юзай на здоровье. Только имей в виду, что при смене компилятора, версии рантайма, операционной системы _msize примененный для памяти выделенной через new может сломаться. А может и не сломаться.
Если ты пишешь для себя - это пофигу. Если работаешь в команде, а проект потом начнут портировать на другую платформу, или юзер вашей программы обновит себе ОС или рантайм, то могут начаться непредсказуемые проблемы.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
23.02.2014, 00:54
Цитата Сообщение от Miwa123 Посмотреть сообщение
находится в конио, работает прекрасно.
а MSDN говорит что в <malloc.h>
http://msdn.microsoft.com/ru-r... 077bc.aspx
и это сугубо про студию
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
23.02.2014, 00:57
Цитата Сообщение от Croessmah Посмотреть сообщение
а MSDN говорит что в <malloc.h>
В mingw - там же.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
23.02.2014, 01:13
В 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
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
23.02.2014, 01:19
Под 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
Цитата Сообщение от DrOffset Посмотреть сообщение
int _msize(void* memory)
Нельзя использовать для памяти выделенной через new.
чушь! Все можно.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
25.02.2014, 16:55
Цитата Сообщение от 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
Цитата Сообщение от DrOffset Посмотреть сообщение
Если оператор new будет реализован через malloc, то тогда это будет работать. В случае другой реализации - могут быть проблемы. Что это означает? Это означает, что в общем случае нельзя полагаться на _msize в случае если память выделена через new
И как по вашему работает оператор "new" если не секрет??? и что значит если оператор "new" выделит память не через "malloc" а через что???

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

Во-вторых ни стандартом, ни какой-то конкретной реализацией не гарантируется, что new будет обязательно реализован через malloc. Не гарантируется даже в пределах одной реализации, достаточно сменить release сборку на debug и компилятор будет генерировать совсем другие вызовы, с другой сервисной информацией о выделенной памяти. Нормальный разработчик должен это учитывать при принятии решений.
0
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 42
26.02.2014, 02:53
если не умеешь ездить на машине это не значит что она не работает!
0
655 / 576 / 164
Регистрация: 13.12.2012
Сообщений: 2,126
26.02.2014, 09:58
FinancialShark, в любом случае отслеживание кол-ва выделенной памяти нет в стандарте, все остальное непереносимые кривые костыли, пользоваться или нет решает разработчик, а раз новичек спрашивает - нечего его сбивать с пути - пусть руководствуется стандартом, иначе потом вырастают рукожопы
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
26.02.2014, 13:01
Добавлено через 12 секунд
Цитата Сообщение от FinancialShark Посмотреть сообщение
если не умеешь ездить на машине это не значит что она не работает!
Цитата Сообщение от DrOffset Посмотреть сообщение
Нормальный разработчик должен это учитывать при принятии решений.
Давай я тебе расшифрую. Нормальный разработчик при принятии решений должен учитывать побочные эффекты. От этого в конце концов зависит его зарплата. Это означает, что если я водитель, то я могу ездить без фар или ремня безопасности, если хочу, но это не означает, что это безопасно. Т.е. я, водитель, оценил ситуацию и принял решение, ага - щас можно! Однако в автошколе учат чему? Правильно, общему случаю, и ГИБДД штрафует по чему? Правильно, по тому же общему случаю. Потому что не всякая частная ситуация применима в общем случае. И на 1 безопасный проезд без фар может оказаться 3 с аварией (а может и нет, но профи должен рассмотреть все варианты).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.02.2014, 13:01

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru