Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.96/76: Рейтинг темы: голосов - 76, средняя оценка - 4.96
46 / 46 / 5
Регистрация: 28.07.2009
Сообщений: 144
1

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

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

Author24 — интернет-сервис помощи студентам
Скажем я в какой-то момент выделяю память под массив:
C++
1
int *a = new int [n];
затем память может изменяться как-то и конечный размер мне не известен.
Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.12.2009, 16:23
Ответы с готовыми решениями:

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

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

Размер выделенной динамической памяти больше чем ожидается
der operator+(char *x) //obj + строка { der newObj; int y=strlen(_name)+strlen(x)+1; ...

Как добавить новой динамической памяти к уже выделенной
Добрый вечер! У меня есть следующий вопрос: Допустим я выделил для некоторой строки память char...

41
373 / 287 / 97
Регистрация: 17.12.2009
Сообщений: 567
22.12.2009, 16:32 2
C++
1
sizeof(int)*n
всегда одно и тоже количество памяти.
а как ты её изменяешь, кстати? О_о
0
46 / 46 / 5
Регистрация: 28.07.2009
Сообщений: 144
22.12.2009, 16:41  [ТС] 3
Ну как изменяют размеры массивов по твоему?
C++
1
2
3
4
int *a = new int [n];
int *tmp =  new int [m];
delete a;
a = tmp;
Мне нужно каждый раз запоминать, сколько я памяти выделял??? А по другому никак?
Ведь сишник точно знает, сколько байт выделяется в этой области, чтобы мог выделить еще память, не задевая уже выделенную. Разве мы не можем это откуда-нить выцепить?
0
373 / 287 / 97
Регистрация: 17.12.2009
Сообщений: 567
22.12.2009, 16:54 4
это не изменение а выделение новой памяти и уничтожение старой, старые данные не сохрантся.
а нсчет узнать размер выделенного массива. можно в его конец терминальный символ поствить '\0' например или другой.

C++
1
2
3
4
5
int *a = new int [n];
*(a+n-1)='\0';//например
int i=0;
while(*(a+i)!='\0') i++;
cout << "length a="<<i <<endl;
что то такое тебе надо да?
2
46 / 46 / 5
Регистрация: 28.07.2009
Сообщений: 144
22.12.2009, 17:02  [ТС] 5
значит, юзать что-то навроде нульсимвола, маркера? Ну чтож, как вариант. Пасиб.
0
373 / 287 / 97
Регистрация: 17.12.2009
Сообщений: 567
22.12.2009, 17:17 6
только я небольшу ошибку допустил!!!
там надо так:

вот рабочая прога:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
    int kolichestvo_elementov=3;
    int n=sizeof(int)*kolichestvo_elementov;
    char *a = new char [n]; //char à íå int; 
    *(a+n)='@';//íàïðèìåð
    int i=0;
    while(*(a+i)!='@') i++;
    cout << "length a="<<i <<endl;
    getch();
    *a=35;
    *(a+4)=123;
    //â òàêîì ñëó÷àè ñ÷èòûâàòü äàííûå íàäî òàê:
    
    int k=0;
    while(k<i){cout << (int)*(a+k) << endl;k+=4;}
    delete [] a;// []- обязательно
    getch();
}
а если в массив надо то:
C++
1
2
3
int mas[kolichestvo_elementov];
int k=0;
while(k<i)mas[(int)(k/sizeof(int))]=(int)*(a+k) ;
0
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 42
21.02.2014, 04:53 7
вернет количество занимаемой памяти в байтах
C++ (Qt)
1
int _msize(void* memory)
а например это вернет размер массива
C++ (Qt)
1
2
3
4
template<typename TYPE> int GetSize(void* Memory)
{
    return _msize(Memory)/sizeof(TYPE);
}
если у тебя массив из int, то вызов функции выглядит так
C++ (Qt)
1
2
3
int* Array = new int[10];
int Count;
Count = GetSize<int>(Array);
Добавлено через 2 минуты
если тебе скорость не важна то используй std::vector
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
21.02.2014, 16:31 8
Цитата Сообщение от FinancialShark Посмотреть сообщение
вернет количество занимаемой памяти в байтах
_msize вроде С-ишная приблуда
1
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
21.02.2014, 16:37 9
Цитата Сообщение от FinancialShark Посмотреть сообщение
int _msize(void* memory)
Нельзя использовать для памяти выделенной через new.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
21.02.2014, 16:39 10
Цитата Сообщение от aLarman Посмотреть сообщение
_msize вроде С-ишная приблуда
это не стандартная приблуда
0
224 / 224 / 38
Регистрация: 17.12.2010
Сообщений: 713
21.02.2014, 16:54 11
вообще динамической память размер надо таскать с собой (за редким исключением)

символ маркер интерестная идея .. но например для структур/классов она не прокатит, слишком опасно..
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
21.02.2014, 16:58 12
Цитата Сообщение от Aloir Посмотреть сообщение
символ маркер интерестная идея .. но например для структур/классов она не прокатит, слишком опасно..
ну дай не один байт а целую строку
а вообще для структур существует другой путь
первым полем идет элемент который содержит размер структуры
0
224 / 224 / 38
Регистрация: 17.12.2010
Сообщений: 713
21.02.2014, 17:04 13
ValeryS, таки да, можно строку, но всегда есть шанс, что она может повторится) хотя этот шанс может стремится к бесконечности

да и тащить лишние символы как конец строки.., особенно когда у нас ограничена длина..) больше проблем, чем просто взять переменную с размером

а другой путь.. ну тут мы опять тащим размер))))
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
21.02.2014, 17:09 14
Цитата Сообщение от Aloir Посмотреть сообщение
а другой путь.. ну тут мы опять тащим размер
а иногда это единственный простой путь
например вот такая структура
C++
1
2
3
4
5
6
7
struct sss
{
int size;
int arg1;
int arg2;
char ccc[0];
}
ccc может иметь любой размер
как узнать малой кровью какой он?
0
224 / 224 / 38
Регистрация: 17.12.2010
Сообщений: 713
21.02.2014, 17:29 15
я бы сказал, это зачустую самый простой путь.

у нас в проекте было тоже

C++
1
long *message;
и сиди гадай сколько там )
0
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 42
22.02.2014, 22:12 16
Вы знаете стандартные?
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
22.02.2014, 22:20 17
Цитата Сообщение от FinancialShark Посмотреть сообщение
Вы знаете стандартные?
Их не существует.
В случае new даже нестандартных нет.
Хранить размер самостоятельно - это нормальный, переносимый и понятный способ. Чем он так не нравится?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
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
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
22.02.2014, 22:36 19
Цитата Сообщение от ValeryS Посмотреть сообщение
но delete же как то узнает
Да.
Но как это отменяет то, что средств нет?
А то, что ты предложил, сам же сказал, не средство, а UB.
0
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 42
22.02.2014, 22:40 20
а чем вам не нравится _msize?

мне интересно... без подвоха
0
22.02.2014, 22:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.02.2014, 22:40
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru