Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.64
JamesBlack
 Аватар для JamesBlack
36 / 36 / 3
Регистрация: 28.07.2009
Сообщений: 144
22.12.2009, 16:23     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #1
Скажем я в какой-то момент выделяю память под массив:
C++
1
int *a = new int [n];
затем память может изменяться как-то и конечный размер мне не известен.
Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2009, 16:23     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a?
Посмотрите здесь:

выделение и удаление памяти, выделенной для динамической строки C++
C++ Как добавить новой динамической памяти к уже выделенной
C++ Как уменьшить размер выделенной памяти
C++ Указатель,объект класса размещенный в динамической памяти
C++ Как узнать размер массива в динамической памяти?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
22.02.2014, 22:41     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #21
Цитата Сообщение от DrOffset Посмотреть сообщение
Но как это отменяет то, что средств нет?
я к тому что
Цитата Сообщение от DrOffset Посмотреть сообщение
нестандартных нет.
нестандартные то как раз есть, но это грязный хак
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
22.02.2014, 22:43     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #22
Цитата Сообщение от ValeryS Посмотреть сообщение
нестандартные то как раз есть, но это грязный хак
Может быть мы по-разному понимаем слово "средства". Но я бы никогда не назвал UB - средством, разве что средством нажить себе проблемы. Под средством я подразумевал нормально работающее в пределах заданной платформы решение. Примером такого решения является упомянутый уже _msize. Для new аналогичных решений - нет.
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
22.02.2014, 22:58     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #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;
}
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
22.02.2014, 23:20     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #24
Цитата Сообщение от ValeryS Посмотреть сообщение
но так скажем полумеры
Не хотел ничего возражать, но тут есть очевидная проблема - выравнивание.
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
23.02.2014, 00:11     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #25
Цитата Сообщение от DrOffset Посмотреть сообщение
Не хотел ничего возражать, но тут есть очевидная проблема - выравнивание.
Не спорю есть
но оно отключается настройками компилятора
Пускай об этом голова болит у тех кто хочет чесать левой рукой правое ухо
весь мир пользуется перетаскиванием размера, весь ДииректИкс на этом построен, а здесь виш ли
Цитата Сообщение от JamesBlack Посмотреть сообщение
Мне нужно каждый раз запоминать, сколько я памяти выделял??? А по другому никак?
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
23.02.2014, 00:24     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #26
Цитата Сообщение от ValeryS Посмотреть сообщение
но оно отключается настройками компилятора
Я разрабатывал программы под платформы, где отключение выравнивания переводило железку в бесконечный ребут. Потому что обращение по не выровненным адресам вызывало аппаратное исключение.
Я понимаю, что ты щас скажешь, что это маленький процент. Но я уже не могу игнорировать этот факт, т.к. лично с ним сталкивался.
Miwa123
37 / 37 / 1
Регистрация: 16.04.2013
Сообщений: 317
Записей в блоге: 1
23.02.2014, 00:33     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #27
спецом протестил _msize().
находится в конио, работает прекрасно.
зачем тратить память на инт, если вот оно решение.
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
23.02.2014, 00:36     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #28
Цитата Сообщение от DrOffset Посмотреть сообщение
Я понимаю, что ты щас скажешь,
Да не скажу
Я полностью на твоей стороне
а примеры приводил, чтобы показать что пути есть и какие там есть "подводные камни"
чтобы не вылез какой нибудь ученик с "А я знаю как"

Добавлено через 2 минуты
Цитата Сообщение от Miwa123 Посмотреть сообщение
спецом протестил _msize().
пользуй кто тебе мешает
только потом не говори что не предупреждали, когда будешь компилить на другом компиляторе ибо
Цитата Сообщение от Croessmah Посмотреть сообщение
это не стандартная приблуда
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
23.02.2014, 00:38     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #29
Цитата Сообщение от Miwa123 Посмотреть сообщение
спецом протестил _msize().
Да юзай на здоровье. Только имей в виду, что при смене компилятора, версии рантайма, операционной системы _msize примененный для памяти выделенной через new может сломаться. А может и не сломаться.
Если ты пишешь для себя - это пофигу. Если работаешь в команде, а проект потом начнут портировать на другую платформу, или юзер вашей программы обновит себе ОС или рантайм, то могут начаться непредсказуемые проблемы.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
23.02.2014, 00:54     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #30
Цитата Сообщение от Miwa123 Посмотреть сообщение
находится в конио, работает прекрасно.
а MSDN говорит что в <malloc.h>
http://msdn.microsoft.com/ru-ru/library/z2s077bc.aspx
и это сугубо про студию
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
23.02.2014, 00:57     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #31
Цитата Сообщение от Croessmah Посмотреть сообщение
а MSDN говорит что в <malloc.h>
В mingw - там же.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
23.02.2014, 01:13     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #32
В RAD Studio XE3 http://docwiki.embarcadero.com/RADStudio/XE3/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.
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
23.02.2014, 01:19     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #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.
FinancialShark
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 41
25.02.2014, 16:45     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #34
Цитата Сообщение от DrOffset Посмотреть сообщение
int _msize(void* memory)
Нельзя использовать для памяти выделенной через new.
чушь! Все можно.
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
25.02.2014, 16:55     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #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.
FinancialShark
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 41
26.02.2014, 01:42     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #36
Цитата Сообщение от DrOffset Посмотреть сообщение
Если оператор new будет реализован через malloc, то тогда это будет работать. В случае другой реализации - могут быть проблемы. Что это означает? Это означает, что в общем случае нельзя полагаться на _msize в случае если память выделена через new
И как по вашему работает оператор "new" если не секрет??? и что значит если оператор "new" выделит память не через "malloc" а через что???

Добавлено через 15 минут
new/delete это тот же malloc/free только new помимо выделения памяти еще инициализирует обект, а delete вызывает дуструктор!
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
26.02.2014, 02:17     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #37
Цитата Сообщение от FinancialShark Посмотреть сообщение
И как по вашему работает оператор "new" если не секрет??? и что значит если оператор "new" выделит память не через "malloc" а через что???
Во-первых оператор new можно перегружать. Про кастомные аллокаторы ведь в курсе? А то ведь там за new и пул памяти может скрываться.

Во-вторых ни стандартом, ни какой-то конкретной реализацией не гарантируется, что new будет обязательно реализован через malloc. Не гарантируется даже в пределах одной реализации, достаточно сменить release сборку на debug и компилятор будет генерировать совсем другие вызовы, с другой сервисной информацией о выделенной памяти. Нормальный разработчик должен это учитывать при принятии решений.
FinancialShark
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 41
26.02.2014, 02:53     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #38
если не умеешь ездить на машине это не значит что она не работает!
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
26.02.2014, 09:58     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #39
FinancialShark, в любом случае отслеживание кол-ва выделенной памяти нет в стандарте, все остальное непереносимые кривые костыли, пользоваться или нет решает разработчик, а раз новичек спрашивает - нечего его сбивать с пути - пусть руководствуется стандартом, иначе потом вырастают рукожопы
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2014, 13:01     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a?
Еще ссылки по теме:

C++ Как обнулить указатель на одну ячейку в динамически-выделенной памяти?
C++ Получить адрес памяти, на который ссылается указатель
Как проверить на какой класс ссылается указатель? C++

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

Или воспользуйтесь поиском по форуму:
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
26.02.2014, 13:01     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #40
Добавлено через 12 секунд
Цитата Сообщение от FinancialShark Посмотреть сообщение
если не умеешь ездить на машине это не значит что она не работает!
Цитата Сообщение от DrOffset Посмотреть сообщение
Нормальный разработчик должен это учитывать при принятии решений.
Давай я тебе расшифрую. Нормальный разработчик при принятии решений должен учитывать побочные эффекты. От этого в конце концов зависит его зарплата. Это означает, что если я водитель, то я могу ездить без фар или ремня безопасности, если хочу, но это не означает, что это безопасно. Т.е. я, водитель, оценил ситуацию и принял решение, ага - щас можно! Однако в автошколе учат чему? Правильно, общему случаю, и ГИБДД штрафует по чему? Правильно, по тому же общему случаю. Потому что не всякая частная ситуация применима в общем случае. И на 1 безопасный проезд без фар может оказаться 3 с аварией (а может и нет, но профи должен рассмотреть все варианты).
Yandex
Объявления
26.02.2014, 13:01     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a?
Ответ Создать тему
Опции темы

Текущее время: 21:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru