gen |
Отправлено: 22.05.2006, 08:53 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 36
|
Привет!
Столкнулся тут со "странным" поведением new на разных машинах. Хотелось бы разобраться. Суть следующая — есть код динамического создания пунктов гл. меню:
CODE |
int i;
TMenuItem* M_menu;
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("Select Name from Main_menu order by Name");
Query1->Open();
Query1->First();
N8->Clear();// очистка подменю
i=0;
while (!Query1->Eof)
{
i++;
TMenuItem* Itm = new TMenuItem(M_menu);
Itm->Caption = Query1->FieldValues["Name"];
Itm->Name = "Nm"+IntToStr(i);
Itm->OnClick=Menu_click;
N8->Add(Itm);
Query1->Next();
}
Query1->Close(); |
Так вот, на одних машинах все отрабатывает без проблем, а на других — вываливается AV в библиотеке RTL при создании объекта. В то же время если создавать Itm через CODE | TMenuItem* Itm = new TMenuItem(this); | то на всех машинах работает без вопросов. Системы на всех машинах одинаковые WinXP SP2 Rus. Вопрос, в общем, не принципиальный, но всегда возникает недоумение, когда сталкиваешься с "системозависимостью" кода. |
|
olegenty |
Отправлено: 22.05.2006, 12:00 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
на тех, где работает — завёлся барабашка, который и вводит тебя в заблуждение.
вот причина ошибки:
M_menu — не инициализированная переменная. надо писать так:
CODE |
TMenuItem* M_menu = NULL;
|
либо
CODE |
TMenuItem* M_menu = <some value>;
|
ошибка происходит на тех машикнах, где M_menu != NULL
|
|
|