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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.64
JamesBlack
 Аватар для JamesBlack
36 / 36 / 3
Регистрация: 28.07.2009
Сообщений: 144
22.12.2009, 16:23     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #1
Скажем я в какой-то момент выделяю память под массив:
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++ Как узнать размер массива в динамической памяти?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
22.12.2009, 16:32     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #2
C++
1
sizeof(int)*n
всегда одно и тоже количество памяти.
а как ты её изменяешь, кстати? О_о
JamesBlack
 Аватар для JamesBlack
36 / 36 / 3
Регистрация: 28.07.2009
Сообщений: 144
22.12.2009, 16:41  [ТС]     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #3
Ну как изменяют размеры массивов по твоему?
C++
1
2
3
4
int *a = new int [n];
int *tmp =  new int [m];
delete a;
a = tmp;
Мне нужно каждый раз запоминать, сколько я памяти выделял??? А по другому никак?
Ведь сишник точно знает, сколько байт выделяется в этой области, чтобы мог выделить еще память, не задевая уже выделенную. Разве мы не можем это откуда-нить выцепить?
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
22.12.2009, 16:54     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #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;
что то такое тебе надо да?
JamesBlack
 Аватар для JamesBlack
36 / 36 / 3
Регистрация: 28.07.2009
Сообщений: 144
22.12.2009, 17:02  [ТС]     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #5
значит, юзать что-то навроде нульсимвола, маркера? Ну чтож, как вариант. Пасиб.
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
22.12.2009, 17:17     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #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) ;
FinancialShark
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 41
21.02.2014, 04:53     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #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
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
21.02.2014, 16:31     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #8
Цитата Сообщение от FinancialShark Посмотреть сообщение
вернет количество занимаемой памяти в байтах
_msize вроде С-ишная приблуда
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,625
21.02.2014, 16:37     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #9
Цитата Сообщение от FinancialShark Посмотреть сообщение
int _msize(void* memory)
Нельзя использовать для памяти выделенной через new.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11837 / 6816 / 771
Регистрация: 27.09.2012
Сообщений: 16,906
Записей в блоге: 2
Завершенные тесты: 1
21.02.2014, 16:39     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #10
Цитата Сообщение от aLarman Посмотреть сообщение
_msize вроде С-ишная приблуда
это не стандартная приблуда
Aloir
 Аватар для Aloir
216 / 216 / 13
Регистрация: 17.12.2010
Сообщений: 688
21.02.2014, 16:54     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #11
вообще динамической память размер надо таскать с собой (за редким исключением)

символ маркер интерестная идея .. но например для структур/классов она не прокатит, слишком опасно..
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
21.02.2014, 16:58     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #12
Цитата Сообщение от Aloir Посмотреть сообщение
символ маркер интерестная идея .. но например для структур/классов она не прокатит, слишком опасно..
ну дай не один байт а целую строку
а вообще для структур существует другой путь
первым полем идет элемент который содержит размер структуры
Aloir
 Аватар для Aloir
216 / 216 / 13
Регистрация: 17.12.2010
Сообщений: 688
21.02.2014, 17:04     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #13
ValeryS, таки да, можно строку, но всегда есть шанс, что она может повторится) хотя этот шанс может стремится к бесконечности

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

а другой путь.. ну тут мы опять тащим размер))))
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
21.02.2014, 17:09     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #14
Цитата Сообщение от Aloir Посмотреть сообщение
а другой путь.. ну тут мы опять тащим размер
а иногда это единственный простой путь
например вот такая структура
C++
1
2
3
4
5
6
7
struct sss
{
int size;
int arg1;
int arg2;
char ccc[0];
}
ccc может иметь любой размер
как узнать малой кровью какой он?
Aloir
 Аватар для Aloir
216 / 216 / 13
Регистрация: 17.12.2010
Сообщений: 688
21.02.2014, 17:29     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #15
я бы сказал, это зачустую самый простой путь.

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

C++
1
long *message;
и сиди гадай сколько там )
FinancialShark
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 41
22.02.2014, 22:12     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #16
Вы знаете стандартные?
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,625
22.02.2014, 22:20     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #17
Цитата Сообщение от FinancialShark Посмотреть сообщение
Вы знаете стандартные?
Их не существует.
В случае new даже нестандартных нет.
Хранить размер самостоятельно - это нормальный, переносимый и понятный способ. Чем он так не нравится?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
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
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,625
22.02.2014, 22:36     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #19
Цитата Сообщение от ValeryS Посмотреть сообщение
но delete же как то узнает
Да.
Но как это отменяет то, что средств нет?
А то, что ты предложил, сам же сказал, не средство, а UB.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2014, 22:40     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
FinancialShark
2 / 2 / 0
Регистрация: 24.01.2014
Сообщений: 41
22.02.2014, 22:40     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? #20
а чем вам не нравится _msize?

мне интересно... без подвоха
Yandex
Объявления
22.02.2014, 22:40     Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a?
Ответ Создать тему
Опции темы

Текущее время: 13:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru