|
|
|||||
Регистрация: Mar 2001
Адрес: msk
Сообщений: 1,416
|
Ещё чуть-чуть С'ей++
Вот в тот раз (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]; }
__________________
#define true false //счастливой отладки, друзья |
|
|||||
Блин может имеет смысл сделать инлайн функцию для того что часто используешь
Ну честно говоря я ваще не понял что за хренотень ты делаешь в твоем примере А картинка так себе
__________________
Кто рано встает, тому... спать весь день хочется. |
|
|||||
Регистрация: Mar 2001
Адрес: msk
Сообщений: 1,416
|
Так. Я не понял чего непонято 8-)
Я дал конструкторы-деструкторы чтоб мож кто глюки мои заметит. Инлайн функции то причём? Просто в классе PANEL у меня куча функций сидит, и чтобы объекты за собой не таскать я в каждой крупной ф-ии делаю свой объект, соответственно, в худшем случае, пяток копий всех вышеперечисленных массивов в памяти валяется. Но ведь это крайне мало - пара килобайт! Значит гдето глюк зарыт. А поскольку падаю я стабильно при проходе конструктора, значит глюк где то в нём, логично? (а если в картинке вторую бабину зделать крутящейся? ?)
__________________
#define true false //счастливой отладки, друзья Последний раз редактировалось MyXus; 08.12.2001 в 16:27. |
|
|||||
Так хотел ответить,так хотел... Но увы, не очень понял листинг.
__________________
suum quique |
|
|||||
Регистрация: Mar 2001
Адрес: msk
Сообщений: 1,416
|
А что непонятно?
Давайте приведу класс? Вот оно (частично) 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-(
__________________
#define true false //счастливой отладки, друзья Последний раз редактировалось MyXus; 08.12.2001 в 16:35. |
|
|||||
Я, конечно, могу ошибаться, но:
1. зачем делать делать delete x_pos? Мне почему-то кажется, что этот-то массив сам уничтожается при вызове деструктора, так как он не является явным указателем и под него не выделяется память оператором new. 2. по-моему, надо делитить не только filename[i], но и сам filename. То же касается остальных двухмерных строковых массивов.
__________________
suum quique |
|
|||||
Регистрация: Mar 2001
Адрес: msk
Сообщений: 1,416
|
2 RFMitrio Да, точно, спасибо Но....
Я в отчаянии просто 8-(( Не могу локализовать ошибку! Есть у меня 2 функции, абсолютно одинаковы кроме одного: в одной я создаю новую ячейку в списке, а для второй - использую старые значения. Вторая сваливается после 20-40 выполнения (мелкие огрехи в работе с памятью, не так страшно, препод не заметит), а вот первая сваливается на втором выполнении. Причём программа падает совершенно в другом месте - в конструкторе, которому видать уже не хватает памяти. Но зависимость установлена точно - как только я отрубаю конструирование новой ячейи - всё живёт! Но алгоритм - безупречнен! Всё работает, после выполнения функции все параметры и значения такие как надо! Чё мне делаааать?????
__________________
#define true false //счастливой отладки, друзья |
|
|||||
Регистрация: Mar 2001
Адрес: msk
Сообщений: 1,416
|
Всё, теперь она вешеатся при любом повторном изменении списков. Пойду повешусь.
(зато Load в список работает!!!)
__________________
#define true false //счастливой отладки, друзья |
|
|||||
Banned
Регистрация: Oct 2001
Адрес: Украина Николаев
Сообщений: 179
|
Да......круто я ваще не въехал в етот развал!
|
|
|||||
гм.... Я конечно в сях не очень рублю... но пара мыслей все таки возникла..
1) Удалять x_pos действительно не нужно - это делается автоматом. 2) Строки в массивах у тебя аллокируются как массивы char. У меня тут возникло воспоминание, что указатели, зааллокированные, как массивы, нужно удалять не простым delete, а delete[] (прям так и пишется со скобками). Уточни, может я и ошибаюсь... Но не бывает дыма без огня. По крайней мере такая фича кажется была в BC++ 4.5 3) Сами массивы names и т.д. тоже надо удалять после удаления их элементов. 4) Нафиг ты каждый раз аллокируешь память под эти элементы, ежели они у тебя лежат константами? Если у тебя эти элементы не могут измениться за время жизни класса, то почему бы тебе не объявить их константами, а в свои массивы пихать просто адреса констант. По моему так.... И быстрее, и практичнее...
__________________
Не ошибается то, что не работает. (с) Windows |
Часовой пояс GMT +4, время: 03:37. |
|
« Предыдущая тема | Следующая тема » |
|
|