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

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

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

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

22.12.2009, 16:23. Просмотров 3062. Ответов 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++
Всем привет. Такой вопрос, что станет с указателем на объект, если этот объект удалить через 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; } Можно...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
22.12.2009, 16:32 #2
C++
1
sizeof(int)*n
всегда одно и тоже количество памяти.
а как ты её изменяешь, кстати? О_о
JamesBlack
37 / 37 / 3
Регистрация: 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;
Мне нужно каждый раз запоминать, сколько я памяти выделял??? А по другому никак?
Ведь сишник точно знает, сколько байт выделяется в этой области, чтобы мог выделить еще память, не задевая уже выделенную. Разве мы не можем это откуда-нить выцепить?
Aye Aye
367 / 281 / 36
Регистрация: 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;
что то такое тебе надо да?
JamesBlack
37 / 37 / 3
Регистрация: 28.07.2009
Сообщений: 144
22.12.2009, 17:02  [ТС] #5
значит, юзать что-то навроде нульсимвола, маркера? Ну чтож, как вариант. Пасиб.
Aye Aye
367 / 281 / 36
Регистрация: 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) ;
FinancialShark
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
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
21.02.2014, 16:31 #8
Цитата Сообщение от FinancialShark Посмотреть сообщение
вернет количество занимаемой памяти в байтах
_msize вроде С-ишная приблуда
DrOffset
7090 / 4231 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
21.02.2014, 16:37 #9
Цитата Сообщение от FinancialShark Посмотреть сообщение
int _msize(void* memory)
Нельзя использовать для памяти выделенной через new.
Croessmah
Модератор
Эксперт CЭксперт С++
13133 / 7396 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
21.02.2014, 16:39 #10
Цитата Сообщение от aLarman Посмотреть сообщение
_msize вроде С-ишная приблуда
это не стандартная приблуда
Aloir
217 / 217 / 13
Регистрация: 17.12.2010
Сообщений: 689
21.02.2014, 16:54 #11
вообще динамической память размер надо таскать с собой (за редким исключением)

символ маркер интерестная идея .. но например для структур/классов она не прокатит, слишком опасно..
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
21.02.2014, 16:58 #12
Цитата Сообщение от Aloir Посмотреть сообщение
символ маркер интерестная идея .. но например для структур/классов она не прокатит, слишком опасно..
ну дай не один байт а целую строку
а вообще для структур существует другой путь
первым полем идет элемент который содержит размер структуры
Aloir
217 / 217 / 13
Регистрация: 17.12.2010
Сообщений: 689
21.02.2014, 17:04 #13
ValeryS, таки да, можно строку, но всегда есть шанс, что она может повторится) хотя этот шанс может стремится к бесконечности

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

а другой путь.. ну тут мы опять тащим размер))))
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
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 может иметь любой размер
как узнать малой кровью какой он?
Aloir
217 / 217 / 13
Регистрация: 17.12.2010
Сообщений: 689
21.02.2014, 17:29 #15
я бы сказал, это зачустую самый простой путь.

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

C++
1
long *message;
и сиди гадай сколько там )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2014, 17:29
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.02.2014, 17:29
Ответ Создать тему
Опции темы

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