Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

Скажем я в какой-то момент выделяю память под массив:
C++
1
int *a = new int [n];
затем память может изменяться как-то и конечный размер мне не известен.
Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2009, 16:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? (C++):

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

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

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

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

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

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

41
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
23.02.2014, 00:57 #31
Цитата Сообщение от Croessmah Посмотреть сообщение
а MSDN говорит что в <malloc.h>
В mingw - там же.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
23.02.2014, 01:13 #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.
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
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
FinancialShark
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 42
25.02.2014, 16:45 #34
Цитата Сообщение от DrOffset Посмотреть сообщение
int _msize(void* memory)
Нельзя использовать для памяти выделенной через new.
чушь! Все можно.
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
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
FinancialShark
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
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
26.02.2014, 02:17 #37
Цитата Сообщение от FinancialShark Посмотреть сообщение
И как по вашему работает оператор "new" если не секрет??? и что значит если оператор "new" выделит память не через "malloc" а через что???
Во-первых оператор new можно перегружать. Про кастомные аллокаторы ведь в курсе? А то ведь там за new и пул памяти может скрываться.

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

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

Выделение и удаление памяти, выделенной для динамической строки - C++
Данная функция производит ввод и собственно контроль ввода (размер массива от 1 до 20, иначе должна выдавать ошибку; при вводе букв также...

Указатель,объект класса размещенный в динамической памяти - C++
Ребят,такой маленький нелепый вопрос. Как можно обратиться к объекту класса созданному в динамической памяти(через &quot;new&quot;)?; В моей книге...

Классы. Объявить массив динамически и сделать указатель на объект в динамической памяти - C++
Я создал классы: ПЕРСОНА, служащий, роботодатель, инженер. Но мне нужно в программе (после int main() 69 строка) объявить массив...


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

Или воспользуйтесь поиском по форуму:
42
Ответ Создать тему
Опции темы

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