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

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

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

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

22.12.2009, 16:23. Просмотров 3569. Ответов 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
FinancialShark
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 42
22.02.2014, 22:12 #16
Вы знаете стандартные?
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
22.02.2014, 22:20 #17
Цитата Сообщение от FinancialShark Посмотреть сообщение
Вы знаете стандартные?
Их не существует.
В случае new даже нестандартных нет.
Хранить размер самостоятельно - это нормальный, переносимый и понятный способ. Чем он так не нравится?
0
ValeryS
Модератор
7003 / 5341 / 527
Регистрация: 14.02.2011
Сообщений: 18,034
22.02.2014, 22:28 #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
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
22.02.2014, 22:36 #19
Цитата Сообщение от ValeryS Посмотреть сообщение
но delete же как то узнает
Да.
Но как это отменяет то, что средств нет?
А то, что ты предложил, сам же сказал, не средство, а UB.
0
FinancialShark
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 42
22.02.2014, 22:40 #20
а чем вам не нравится _msize?

мне интересно... без подвоха
0
ValeryS
Модератор
7003 / 5341 / 527
Регистрация: 14.02.2011
Сообщений: 18,034
22.02.2014, 22:41 #21
Цитата Сообщение от DrOffset Посмотреть сообщение
Но как это отменяет то, что средств нет?
я к тому что
Цитата Сообщение от DrOffset Посмотреть сообщение
нестандартных нет.
нестандартные то как раз есть, но это грязный хак
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
22.02.2014, 22:43 #22
Цитата Сообщение от ValeryS Посмотреть сообщение
нестандартные то как раз есть, но это грязный хак
Может быть мы по-разному понимаем слово "средства". Но я бы никогда не назвал UB - средством, разве что средством нажить себе проблемы. Под средством я подразумевал нормально работающее в пределах заданной платформы решение. Примером такого решения является упомянутый уже _msize. Для new аналогичных решений - нет.
1
ValeryS
Модератор
7003 / 5341 / 527
Регистрация: 14.02.2011
Сообщений: 18,034
22.02.2014, 22:58 #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;
}
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
22.02.2014, 23:20 #24
Цитата Сообщение от ValeryS Посмотреть сообщение
но так скажем полумеры
Не хотел ничего возражать, но тут есть очевидная проблема - выравнивание.
0
ValeryS
Модератор
7003 / 5341 / 527
Регистрация: 14.02.2011
Сообщений: 18,034
23.02.2014, 00:11 #25
Цитата Сообщение от DrOffset Посмотреть сообщение
Не хотел ничего возражать, но тут есть очевидная проблема - выравнивание.
Не спорю есть
но оно отключается настройками компилятора
Пускай об этом голова болит у тех кто хочет чесать левой рукой правое ухо
весь мир пользуется перетаскиванием размера, весь ДииректИкс на этом построен, а здесь виш ли
Цитата Сообщение от JamesBlack Посмотреть сообщение
Мне нужно каждый раз запоминать, сколько я памяти выделял??? А по другому никак?
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
23.02.2014, 00:24 #26
Цитата Сообщение от ValeryS Посмотреть сообщение
но оно отключается настройками компилятора
Я разрабатывал программы под платформы, где отключение выравнивания переводило железку в бесконечный ребут. Потому что обращение по не выровненным адресам вызывало аппаратное исключение.
Я понимаю, что ты щас скажешь, что это маленький процент. Но я уже не могу игнорировать этот факт, т.к. лично с ним сталкивался.
0
Miwa123
37 / 37 / 1
Регистрация: 16.04.2013
Сообщений: 319
Записей в блоге: 1
23.02.2014, 00:33 #27
спецом протестил _msize().
находится в конио, работает прекрасно.
зачем тратить память на инт, если вот оно решение.
0
ValeryS
Модератор
7003 / 5341 / 527
Регистрация: 14.02.2011
Сообщений: 18,034
23.02.2014, 00:36 #28
Цитата Сообщение от DrOffset Посмотреть сообщение
Я понимаю, что ты щас скажешь,
Да не скажу
Я полностью на твоей стороне
а примеры приводил, чтобы показать что пути есть и какие там есть "подводные камни"
чтобы не вылез какой нибудь ученик с "А я знаю как"

Добавлено через 2 минуты
Цитата Сообщение от Miwa123 Посмотреть сообщение
спецом протестил _msize().
пользуй кто тебе мешает
только потом не говори что не предупреждали, когда будешь компилить на другом компиляторе ибо
Цитата Сообщение от Croessmah Посмотреть сообщение
это не стандартная приблуда
1
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
23.02.2014, 00:38 #29
Цитата Сообщение от Miwa123 Посмотреть сообщение
спецом протестил _msize().
Да юзай на здоровье. Только имей в виду, что при смене компилятора, версии рантайма, операционной системы _msize примененный для памяти выделенной через new может сломаться. А может и не сломаться.
Если ты пишешь для себя - это пофигу. Если работаешь в команде, а проект потом начнут портировать на другую платформу, или юзер вашей программы обновит себе ОС или рантайм, то могут начаться непредсказуемые проблемы.
0
Croessmah
Ушел
13775 / 8025 / 925
Регистрация: 27.09.2012
Сообщений: 19,768
Записей в блоге: 3
Завершенные тесты: 1
23.02.2014, 00:54 #30
Цитата Сообщение от Miwa123 Посмотреть сообщение
находится в конио, работает прекрасно.
а MSDN говорит что в <malloc.h>
http://msdn.microsoft.com/ru-ru/library/z2s077bc.aspx
и это сугубо про студию
0
23.02.2014, 00:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2014, 00:54
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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