Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Флейм (http://www.flasher.ru/forum/forumdisplay.php?f=7)
-   -   Ещё чуть-чуть С'ей++ (http://www.flasher.ru/forum/showthread.php?t=24225)

MyXus 08.12.2001 15:38

Ещё чуть-чуть С'ей++
 
Вот в тот раз (2 дня назад) я боролся сэтим классом, щас программу чуть усложнил - теперь опять на нём всё падает. Дело в том что он очень часто используется и соответственно очень часто гоняется конструктор. Ну так ведь и деструктор живой! В чём дело?
Симпотмы (в зависимости от настроения компилятора)
-глухое вылетание
-полная билиберда на экране (выводится всё что только можно одновременно)
-тормоз как на i8086 - каждая операция выполняется по 2-5 секунд, и после выполнения нескольких функций переходим в п.2 или п.1

Деструктор и конструктор:

PANEL::PANEL()
{
pos=1;
t_pos=1;
y_pos=1;
Delay=0;
x_pos[0]=3;
x_pos[1]=13;
x_pos[2]=27;
x_pos[3]=39;
strcpy(names[0],"Файл");
strcpy(names[1],"Добавить");
strcpy(names[2],"Помощь");
strcpy(names[3],"Выход");

filemenu=new char*[6];
for(int i=0;i<6;i++)
filemenu[i]=new char[29];
strcpy(filemenu[0],"Новое окно ");
strcpy(filemenu[1],"Открыть ");
strcpy(filemenu[2],"Сохранить ");
strcpy(filemenu[3],"Сохранить как ... ");
strcpy(filemenu[4],"Изменить справочники ");
strcpy(filemenu[5],"Распечатать таблицу ");

basemenu=new char*[3];
for(i=0;i<3;i++)
basemenu[i]=new char[27];
strcpy(basemenu[0],"Справочник названий фирм");
strcpy(basemenu[1],"Справочник телефонов ");
strcpy(basemenu[2],"Справочник адресов ");

addmenu=new char*[2];
for(i=0;i<2;i++)
addmenu[i]=new char[27];
strcpy(addmenu[0],"Добавить запись ");
strcpy(addmenu[1],"Редактировать таблицу ");
}

PANEL::~PANEL()
{
delete x_pos;
for(int i=0;i<4;i++) delete names[i];
for(i=0;i<6;i++) delete filemenu[i];
for(i=0;i<3;i++) delete basemenu[i];
for(i=0;i<2;i++) delete addmenu[i];
}

Countach 08.12.2001 16:14

Блин может имеет смысл сделать инлайн функцию для того что часто используешь :)
Ну честно говоря я ваще не понял что за хренотень ты делаешь в твоем примере :)

А картинка так себе ;)

MyXus 08.12.2001 16:24

Так. Я не понял чего непонято 8-)
Я дал конструкторы-деструкторы чтоб мож кто глюки мои заметит.
Инлайн функции то причём? Просто в классе PANEL у меня куча функций сидит, и чтобы объекты за собой не таскать я в каждой крупной ф-ии делаю свой объект, соответственно, в худшем случае, пяток копий всех вышеперечисленных массивов в памяти валяется. Но ведь это крайне мало - пара килобайт! Значит гдето глюк зарыт. А поскольку падаю я стабильно при проходе конструктора, значит глюк где то в нём, логично?

(а если в картинке вторую бабину зделать крутящейся? :D ?)

RFMitrio 08.12.2001 16:28

Так хотел ответить,так хотел... :) Но увы, не очень понял листинг.

MyXus 08.12.2001 16:33

А что непонятно?
Давайте приведу класс?
Вот оно (частично)

class PANEL {
public: int pos,x_pos[4],y_pos,t_pos,Delay,StrNum;
char **filemenu,**addmenu,**basemenu;
public: char names[4][20];
.........................ОПИСАНИЕ ФУНКЦИЙ............................
PANEL();
~PANEL();
};

Короче, первый листинг - простая инициализация массивов. Но почему то плохо работает. Нестабильно. Я такое лечить не умею 8-(

RFMitrio 08.12.2001 16:44

Я, конечно, могу ошибаться, но:
1. зачем делать делать delete x_pos? Мне почему-то кажется, что этот-то массив сам уничтожается при вызове деструктора, так как он не является явным указателем и под него не выделяется память оператором new.
2. по-моему, надо делитить не только filename[i], но и сам filename. То же касается остальных двухмерных строковых массивов.

MyXus 08.12.2001 19:05

2 RFMitrio Да, точно, спасибо :) Но....

Я в отчаянии просто 8-(( Не могу локализовать ошибку! Есть у меня 2 функции, абсолютно одинаковы кроме одного: в одной я создаю новую ячейку в списке, а для второй - использую старые значения. Вторая сваливается после 20-40 выполнения (мелкие огрехи в работе с памятью, не так страшно, препод не заметит), а вот первая сваливается на втором выполнении. Причём программа падает совершенно в другом месте - в конструкторе, которому видать уже не хватает памяти. Но зависимость установлена точно - как только я отрубаю конструирование новой ячейи - всё живёт! Но алгоритм - безупречнен! Всё работает, после выполнения функции все параметры и значения такие как надо! Чё мне делаааать?????

MyXus 08.12.2001 20:01

Всё, теперь она вешеатся при любом повторном изменении списков. Пойду повешусь.

(зато Load в список работает!!!)

Docelon 08.12.2001 20:53

Да......круто я ваще не въехал в етот развал!

DeepDiver 08.12.2001 23:59

гм.... Я конечно в сях не очень рублю... но пара мыслей все таки возникла..

1) Удалять x_pos действительно не нужно - это делается автоматом.

2) Строки в массивах у тебя аллокируются как массивы char. У меня тут возникло воспоминание, что указатели, зааллокированные, как массивы, нужно удалять не простым delete, а delete[] (прям так и пишется со скобками). Уточни, может я и ошибаюсь... Но не бывает дыма без огня. По крайней мере такая фича кажется была в BC++ 4.5

3) Сами массивы names и т.д. тоже надо удалять после удаления их элементов.

4) Нафиг ты каждый раз аллокируешь память под эти элементы, ежели они у тебя лежат константами? Если у тебя эти элементы не могут измениться за время жизни класса, то почему бы тебе не объявить их константами, а в свои массивы пихать просто адреса констант. По моему так.... И быстрее, и практичнее...


Часовой пояс GMT +4, время: 12:58.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.