Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: C++ грамотное выделение памяти в циклах [SOLVED]  (Прочитано 1373 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Compinfer

  • Автор темы
  • Любитель
  • *
  • Сообщений: 67
    • Просмотр профиля
Как грамотно оформить выделение памяти в циклах в C++?
Не хочется, чтобы каждый раз выделялась и освобождалась память

Если делать так:
for(...){
вычисляем mA;
qA=new Quark[mA];
делаем что-то с qA;
delete[] qA;
}
то, как я понимаю, каждый раз будет выделяться и освобождаться память, что скажется на быстродействии.
Если же перевыделять память только в случае ее нехватки
if (mA>mAmax) {
mAmax=mA+1;
delete[] qA;
qA=new Quark[mAmax];
};
код наподобии этого вызывает ошибку во время выполнения программы:
*** glibc detected *** /path/stpp: free(): invalid next size (normal): 0x081de360 ***

Вроде, выделение памяти в стиле Си позволяет решить эту проблему. Но почему не работают new\delete? И как эту задачу обычно решают?
« Последнее редактирование: 04 Ноября 2010, 20:30:59 от Compinfer »

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: C++ грамотное выделение памяти в циклах
« Ответ #1 : 04 Ноября 2010, 19:27:44 »
А когда у вас первая итерация цикла проходит, память под qA выделена, или вы пустой указатель освобождаете?

Оффлайн Compinfer

  • Автор темы
  • Любитель
  • *
  • Сообщений: 67
    • Просмотр профиля
Re: C++ грамотное выделение памяти в циклах
« Ответ #2 : 04 Ноября 2010, 19:36:21 »
Первоначально под qA память я выделяю в конструкторе класса
Generator::Generator()
{
   cout<<"конструкция Generator"<<endl;
   mAmax=100;
   mBmax=100;
   qA=new Quark[2*mAmax];
   qB=new Quark[2*mBmax];
   dipA=new Dipole[mAmax];
   dipB=new Dipole[mBmax];
   dipProbMatrix=new double[mAmax*mBmax];

};
(Нажмите, чтобы показать/скрыть)

Пользователь решил продолжить мысль 04 Ноября 2010, 20:30:29:
разобрался, проблему вызывал другой участок кода.
Выводы:
1. так делать можно.
2. проверять нужно весь код.
« Последнее редактирование: 04 Ноября 2010, 20:30:29 от Compinfer »

 

Страница сгенерирована за 0.021 секунд. Запросов: 21.