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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.64
JamesBlack
37 / 37 / 3
Регистрация: 28.07.2009
Сообщений: 144
#1

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

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

Скажем я в какой-то момент выделяю память под массив:
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++ Как уменьшить размер выделенной памяти
C++ Как обнулить указатель на одну ячейку в динамически-выделенной памяти?
C++ Получить адрес памяти, на который ссылается указатель
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
23.02.2014, 00:57     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #31
Цитата Сообщение от Croessmah Посмотреть сообщение
а MSDN говорит что в <malloc.h>
В mingw - там же.
Croessmah
Модератор
Эксперт CЭксперт С++
13056 / 7319 / 816
Регистрация: 27.09.2012
Сообщений: 18,055
Записей в блоге: 3
Завершенные тесты: 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
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
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
Сообщений: 42
25.02.2014, 16:45     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #34
Цитата Сообщение от DrOffset Посмотреть сообщение
int _msize(void* memory)
Нельзя использовать для памяти выделенной через new.
чушь! Все можно.
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
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
Сообщений: 42
26.02.2014, 01:42     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #36
Цитата Сообщение от DrOffset Посмотреть сообщение
Если оператор new будет реализован через malloc, то тогда это будет работать. В случае другой реализации - могут быть проблемы. Что это означает? Это означает, что в общем случае нельзя полагаться на _msize в случае если память выделена через new
И как по вашему работает оператор "new" если не секрет??? и что значит если оператор "new" выделит память не через "malloc" а через что???

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

Во-вторых ни стандартом, ни какой-то конкретной реализацией не гарантируется, что new будет обязательно реализован через malloc. Не гарантируется даже в пределах одной реализации, достаточно сменить release сборку на debug и компилятор будет генерировать совсем другие вызовы, с другой сервисной информацией о выделенной памяти. Нормальный разработчик должен это учитывать при принятии решений.
FinancialShark
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 42
26.02.2014, 02:53     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #38
если не умеешь ездить на машине это не значит что она не работает!
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
26.02.2014, 09:58     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #39
FinancialShark, в любом случае отслеживание кол-ва выделенной памяти нет в стандарте, все остальное непереносимые кривые костыли, пользоваться или нет решает разработчик, а раз новичек спрашивает - нечего его сбивать с пути - пусть руководствуется стандартом, иначе потом вырастают рукожопы
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
26.02.2014, 13:01     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #40
Добавлено через 12 секунд
Цитата Сообщение от FinancialShark Посмотреть сообщение
если не умеешь ездить на машине это не значит что она не работает!
Цитата Сообщение от DrOffset Посмотреть сообщение
Нормальный разработчик должен это учитывать при принятии решений.
Давай я тебе расшифрую. Нормальный разработчик при принятии решений должен учитывать побочные эффекты. От этого в конце концов зависит его зарплата. Это означает, что если я водитель, то я могу ездить без фар или ремня безопасности, если хочу, но это не означает, что это безопасно. Т.е. я, водитель, оценил ситуацию и принял решение, ага - щас можно! Однако в автошколе учат чему? Правильно, общему случаю, и ГИБДД штрафует по чему? Правильно, по тому же общему случаю. Потому что не всякая частная ситуация применима в общем случае. И на 1 безопасный проезд без фар может оказаться 3 с аварией (а может и нет, но профи должен рассмотреть все варианты).
FinancialShark
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 42
27.02.2014, 01:37     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #41
http://www.cplusplus.com/reference/n...r%20new%5B%5D/
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2014, 08:48     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a?
Еще ссылки по теме:
Выделение и удаление памяти, выделенной для динамической строки C++
C++ Указатель,объект класса размещенный в динамической памяти
Классы. Объявить массив динамически и сделать указатель на объект в динамической памяти C++
C++ Узнать количество динамической памяти
Как проверить на какой класс ссылается указатель? C++

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

Или воспользуйтесь поиском по форуму:
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
27.02.2014, 08:48     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #42
FinancialShark, ну и? что в той ссылке противоречит уже сказанному? или зачем ты ее кинул тода?
Yandex
Объявления
27.02.2014, 08:48     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru