C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Памяти не хватает!
** начинающий
Отправлено: 30.07.2005, 05:29


Не зарегистрирован







Тут такая вот вещь!
В базу данных вводятся данные через форму. Введя примерно 70-100 раз, прога виснет. Смысл ввода таков: нажал добавить — форма открылась; заполнил, нажал принять — форма закрылась(Close()), обработав введенные данные. Обычно, когда виснет,никаких сообщений нет, просто пикает динамик когда пытешься что-нибудь сделать в программе. А ингда вылазит табло, примерно следующего содержания: Системная ошибка, недостаточно памяти!

Код под открытие формы для ввода данных:
try {
Application->CreateForm(__classid(TfrmP), &frmP);
}
catch (...)
{
ShowMessage("Cann't open form!");
}

try{
frmP->ShowModal();
}__finally{
delete frmP;
}
Может кто-нибудь видет тупость в моем коде из-за чего и виснет прога?
Дело точно в форме, никак не в базе! Проверял!
olegenty
Отправлено: 30.07.2005, 06:47


Ветеран

Группа: Модератор
Сообщений: 2412



угу. так не делается.
в auto_ptr оберни, либо делай new/delete
** начинающий
Отправлено: 30.07.2005, 11:37


Не зарегистрирован







to olegenty:
Я тебя не совсем понимаю! Если не втягость немного поподробнее можешь?
olegenty
Отправлено: 30.07.2005, 12:13


Ветеран

Группа: Модератор
Сообщений: 2412



хорошо, чтобы ты сам всё осознал, включи CodeGuard и пронаблюдай, что и где у тебя не освобождается. ну и диспетчер задач поэксплуатируй.

вообще же, если НЕ собираешься удалять форму, то создавай её посредством Application->CreateForm — тогда Application сам её удалит, когда сочтёт нужным (при разрушении). а если собираешься, то создавай формы посредством new, а разрушай посредством delete.

кроме того, я вообще не считаю целесообразным что-либо создавать/удалять динамически, если оно используется ПОСТОЯННО (70-100 вводов, это уже повод, чтобы форму создать и удалить всего один раз — при создании приложения и при его разрушении, а когда она не нужна — просто скрывать)
** начинающий
Отправлено: 30.07.2005, 12:23


Не зарегистрирован







Code Guard — обязательно поруйсь в сети и скачаю! С диспетчером играл — здесь сразу видно дело в форме. CreateForm(): дак я же так и делаю, но у меня видать не удаляется. У меня, код который изложен в первом сообщеннии, повторяется получается 70-100 раз, пока не повиснет прога. Этот код — код под кнопкон. Слушай, ты ведь наверняка знаешь что в моем коде уж точно не полюдски? Я, как начинающий, наверное веселю вас здесь!
** начинающий
Отправлено: 30.07.2005, 12:37


Не зарегистрирован







Это на начальном этапе исп. программы(ввод данных) форма за сутки открывается раз — 1000. А потом, а и за неделю раз 50 то и не откроется — не потребуется просто.
olegenty
Отправлено: 30.07.2005, 12:47


Ветеран

Группа: Модератор
Сообщений: 2412



ну так опубликуй "код под кнопкой", посмотрим, что у него болит...
** начинающий
Отправлено: 30.07.2005, 12:56


Не зарегистрирован







Первое сообщение — в нем есть код, он же код под кнопкой, создающий форму. Вызывается этот код 70-100 раз, пока, как не печально, не повиснет прога.

Когда форма открыта, юзер после ввода данных жмет на кнопку Принять. Нажав на Принять, данные заносятся в таблицу, а потом методом Close() форма закрывается(а я, даже думал убивается).

Сейчас код самой открывающей формыопубликовать не смогу, машина не моя, исходников под рукой просто нет. Да в нем нет ничего мудренного: динамически ничего не создается.
Konstantine
Отправлено: 01.08.2005, 09:42


Мастер участка

Группа: Модератор
Сообщений: 545



а зачем создавать/удалять форму?
почему просто не использовать Show/Hide?
** начинающий
Отправлено: 01.08.2005, 15:39


Не зарегистрирован







Прсто сейчас на начальном этапе им(пользователям) нужно ввести много данных, а потом это процедура будет очень редкой! По-этому, я бы хотел узнать, как создать форму и удалить ее на х... без ущерба памяти
Vlad
Отправлено: 01.08.2005, 15:50


Машинист паровоза

Группа: Участник
Сообщений: 231



Да не выделывайся ты напиши проще
CODE

frmP = new TfrmP(Application);      // создадим
             frmP->ShowModal();       // покажем в модальном режиме
      delete frmP;                           //грохнем на фиг  

*начинающий
Отправлено: 02.08.2005, 00:26


Не зарегистрирован







А я и не выделываюсь, просто нечем выделываться — знаний мало!
Вот ты предложил прмер, чем он хуже моего(См. Тему)? Хотя нет разница чуствуется — выходит объекты созданные не по оператору new удалить опером delete никак? Или такая байда только с формой?
vvoid
Отправлено: 02.08.2005, 12:49


Машинист паровоза

Группа: Участник
Сообщений: 171



Попробуй так (реакция на OnClose твоей формы):
CODE

void __fastcall    TForm1::FormClose  (TObject               *SenderPtr,
                                                           TCloseAction       &Action)
{
  Action = caFree;
}


Удачи!
Георгий
Отправлено: 02.08.2005, 20:16


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



если создал что-то с помошью new — удаляй delete
new[] — delete[]
malloc — free
и т.д.
olegenty
Отправлено: 03.08.2005, 07:19


Ветеран

Группа: Модератор
Сообщений: 2412



в некоторых случаях можно не удалять. auto_ptr оченно понравился...

Вернуться в Вопросы программирования в C++Builder