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

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

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

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

22.12.2009, 16:23. Просмотров 3028. Ответов 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++ Получить адрес памяти, на который ссылается указатель
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
FinancialShark
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 42
22.02.2014, 22:12     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #16
Вы знаете стандартные?
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
22.02.2014, 22:20     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #17
Цитата Сообщение от FinancialShark Посмотреть сообщение
Вы знаете стандартные?
Их не существует.
В случае new даже нестандартных нет.
Хранить размер самостоятельно - это нормальный, переносимый и понятный способ. Чем он так не нравится?
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,735
22.02.2014, 22:28     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #18
Цитата Сообщение от DrOffset Посмотреть сообщение
В случае new даже нестандартных нет.
но delete же как то узнает

я как то баловался и находил размер он лежал перед выделенной памятью за 4 байта

типа так
C++
1
2
3
int * a=new int[100];
int *b=a-1;
int size =*b;//100
но гарантировать сам понимаешь это никто не может
тот же компилятор но в другой версии, или с другими настройками может бросить этот размер совершенно в другое место

Добавлено через 1 минуту
или даже так
C++
1
2
int * a=new int[100];
int size =a[-1];//100
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
22.02.2014, 22:36     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #19
Цитата Сообщение от ValeryS Посмотреть сообщение
но delete же как то узнает
Да.
Но как это отменяет то, что средств нет?
А то, что ты предложил, сам же сказал, не средство, а UB.
FinancialShark
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 42
22.02.2014, 22:40     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #20
а чем вам не нравится _msize?

мне интересно... без подвоха
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,735
22.02.2014, 22:41     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #21
Цитата Сообщение от DrOffset Посмотреть сообщение
Но как это отменяет то, что средств нет?
я к тому что
Цитата Сообщение от DrOffset Посмотреть сообщение
нестандартных нет.
нестандартные то как раз есть, но это грязный хак
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
22.02.2014, 22:43     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #22
Цитата Сообщение от ValeryS Посмотреть сообщение
нестандартные то как раз есть, но это грязный хак
Может быть мы по-разному понимаем слово "средства". Но я бы никогда не назвал UB - средством, разве что средством нажить себе проблемы. Под средством я подразумевал нормально работающее в пределах заданной платформы решение. Примером такого решения является упомянутый уже _msize. Для new аналогичных решений - нет.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,735
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
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
22.02.2014, 23:20     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #24
Цитата Сообщение от ValeryS Посмотреть сообщение
но так скажем полумеры
Не хотел ничего возражать, но тут есть очевидная проблема - выравнивание.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,735
23.02.2014, 00:11     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #25
Цитата Сообщение от DrOffset Посмотреть сообщение
Не хотел ничего возражать, но тут есть очевидная проблема - выравнивание.
Не спорю есть
но оно отключается настройками компилятора
Пускай об этом голова болит у тех кто хочет чесать левой рукой правое ухо
весь мир пользуется перетаскиванием размера, весь ДииректИкс на этом построен, а здесь виш ли
Цитата Сообщение от JamesBlack Посмотреть сообщение
Мне нужно каждый раз запоминать, сколько я памяти выделял??? А по другому никак?
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
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
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,735
23.02.2014, 00:36     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #28
Цитата Сообщение от DrOffset Посмотреть сообщение
Я понимаю, что ты щас скажешь,
Да не скажу
Я полностью на твоей стороне
а примеры приводил, чтобы показать что пути есть и какие там есть "подводные камни"
чтобы не вылез какой нибудь ученик с "А я знаю как"

Добавлено через 2 минуты
Цитата Сообщение от Miwa123 Посмотреть сообщение
спецом протестил _msize().
пользуй кто тебе мешает
только потом не говори что не предупреждали, когда будешь компилить на другом компиляторе ибо
Цитата Сообщение от Croessmah Посмотреть сообщение
это не стандартная приблуда
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
23.02.2014, 00:38     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #29
Цитата Сообщение от Miwa123 Посмотреть сообщение
спецом протестил _msize().
Да юзай на здоровье. Только имей в виду, что при смене компилятора, версии рантайма, операционной системы _msize примененный для памяти выделенной через new может сломаться. А может и не сломаться.
Если ты пишешь для себя - это пофигу. Если работаешь в команде, а проект потом начнут портировать на другую платформу, или юзер вашей программы обновит себе ОС или рантайм, то могут начаться непредсказуемые проблемы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2014, 00:54     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a?
Еще ссылки по теме:
Выделение и удаление памяти, выделенной для динамической строки C++
C++ Указатель,объект класса размещенный в динамической памяти
Классы. Объявить массив динамически и сделать указатель на объект в динамической памяти C++
C++ Узнать количество динамической памяти
Как проверить на какой класс ссылается указатель? C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
23.02.2014, 00:54     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #30
Цитата Сообщение от Miwa123 Посмотреть сообщение
находится в конио, работает прекрасно.
а MSDN говорит что в <malloc.h>
http://msdn.microsoft.com/ru-ru/library/z2s077bc.aspx
и это сугубо про студию
Yandex
Объявления
23.02.2014, 00:54     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a?
Ответ Создать тему
Опции темы

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