Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2011, 09:31   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
Вопрос Динамическое выделение памяти , realloc.

Вот есть такой участок кода...
Код:
inline void getAnyMemory()
{
      cout << "Getting more memory...\n";
      count = ++size;
      pArray = (int*)realloc(pArray , currentSize() );
}
Где count - количество элементов, size - размер контейнера, pArray имеет тип int*, ну а currentSize() - возвращает count*sizeof(int).
Однако при запуске я получаю ошибку...

Но если сделать так:
Код:
inline void getAnyMemory()
{
      cout << "Getting more memory...\n";
      count = ++size;
      realloc(pArray , currentSize() );
}
То ошибка по непонятным причинам исчезает..Почему?
_-Re@l-_ вне форума Ответить с цитированием
Старый 02.11.2011, 10:02   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

А что в "подробностях"?
Откуда Вы знаете, что проблема возникает в getAnyMemory - ведь после realloc ничего не выводится?
Хотелось бы всё-таки уточнить, как объявлен и чем инициализирован pArray.
Abstraction вне форума Ответить с цитированием
Старый 02.11.2011, 10:35   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Видите ли, я немного протестил свой код и выяснил, что ошипка возникает именно в getAnyMemory().
Ну а выделяется память так..
Код:
pArray = (int*)malloc(size*sizeof(int));
Где size инициализируется заданным числом n.
_-Re@l-_ вне форума Ответить с цитированием
Старый 02.11.2011, 10:41   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Так что в "подробностях проблемы"? Можно ли вывести, что возвращает realloc, или программа падает раньше?
И включена ли оптимизация при компиляции кода? Теоретически, второй вариант оптимизатор мог как-нибудь по-хитрому соптимизировать.
Abstraction вне форума Ответить с цитированием
Старый 02.11.2011, 14:03   #5
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

В первом случае - нельзя. Падает раньше.
А вот во втором случае всё работает стабильно.
_-Re@l-_ вне форума Ответить с цитированием
Старый 02.11.2011, 16:14   #6
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
count = ++size;
Как это понимать? Если count - количество элементов, а size - их суммарный размер, то делать бы следовало так:
Код:
size += sizeof(int); count = size / sizeof(int);
Хотя это, в общем то, тоже криво. Лучше отказаться от переменной size - оставить только count.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 02.11.2011, 16:27   #7
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Короче, покажите весь код, если он не засекречен.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 03.11.2011, 09:36   #8
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Ctrl, нет. count - текущее количество элементов. size - текущий размер ... ну.. массива, скажем так. В случае если память исчерпана, то выделяется дополнительная память ещё для одного элемента.
Syuf, весь код покажу позже - сейчас возможности нет.
_-Re@l-_ вне форума Ответить с цитированием
Старый 03.11.2011, 10:20   #9
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Что будет, если а) убрать inline; б) после этого написать unsigned int retVal = (unsigned int)(realloc(pArray , currentSize())); std::cout << retVal;
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатели, динамическое выделение памяти, работа с файлом, в C++. Lexa1208 Помощь студентам 0 13.02.2011 19:17
динамическое выделение памяти. Turbo pascal AHD Помощь студентам 2 10.12.2010 14:27
Динамическое выделение памяти, как лучше? Пепел Феникса Общие вопросы по программированию, компьютерный форум 10 11.03.2010 09:44
Динамическое выделение памяти под массивы Артем125 Общие вопросы C/C++ 4 07.04.2009 09:52
Динамическое выделение памяти FW-TOT Общие вопросы C/C++ 2 19.12.2008 00:42