Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2009, 16:57   #1
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию Не уничтожается объект

Доброго времени суток уважаемые эксперты. Пишу класс "нейронная сеть" (хотя для данной проблеммы - это не имеет никакого значения). Если на пальцах то суть такова:
Класс 1 (использует динамический массив типа double);
Класс 2 (использует динамический массив типа Класс 1);
Класс 3 (использует динамический массив типа Класс 2);
Вот собственно вопрос:
Второй класс, замечательно согласуется с первым (все объекты уничтожается - операционка спокойна )
А вот третий класс никак не хочет согласовываться со вторым. Точнее он то с ним работает как надо, но почему-то, после завершения работы, не срабатывает ни один деструктор. Я уже не знаю что с ним делать.
З.Ы. Исходники прилогаются.
З.З.Ы. Пишу на Visual Studio 6.0
Вложения
Тип файла: rar Network.rar (14.0 Кб, 20 просмотров)
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 13.06.2009, 17:24   #2
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Ну же ребята. Неужто никто не поможет?
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 15.06.2009, 12:24   #3
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

Если еще актуально, то есть следующие идеи. Конкретно про деструкторы не проверял, но похоже, что у тебя там есть битье по памяти, и просто все слетает.
А вообще, есть общие замечания по коду.

1) У тебя в конструкторах классов указатели на массивы не инициализируются в NULL. Потом у тебя в некоторых методах (типа create) стоит вызов delete. Может быть, он и не выполнится, но по сути очень нехорошо.

2) Зачем у тебя в деструкторах обнуляются все переменные? Это никому не нужная работа.

3) Если указатели правильно инициализируются в NULL, то при вызове delete можно не делать проверок на размер массива и т.п., а просто вызывать delete. В нем есть встроенная проверка на NULL. Так что деструктор класса CNeuron, например, должен выглядеть как-то так:
Код:
CNeuron::~CNeuron()
{
    delete [] w;
}
и все.

3) Чтобы не париться самому с массивами, лучше использовать какие-нибудь шаблонные классы для массивов. Тогда, к тому же, отпадут все ошибки по их обработке, которые ты мог сделать.

4) Обнулять элементы массива лучше не через цикл по всем элементам, а вызовом функции обнуления памяти, типа memset.

5) В классе CInitArray в операторе [] переданный индекс внутри уменьшается на 1. Знаю по опыту, что такие вещи делать крайне вредно. Это скрытая логика, про которую ты сам через неделю забудешь. Лучше индексировать по-честному от 0.

А запрещенный доступ сам ищи

Последний раз редактировалось Pashan; 15.06.2009 в 12:34.
Pashan вне форума Ответить с цитированием
Старый 18.06.2009, 17:13   #4
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Цитата:
Сообщение от Pashan Посмотреть сообщение
Если еще актуально, то есть следующие идеи. Конкретно про деструкторы не проверял, но похоже, что у тебя там есть битье по памяти, и просто все слетает.
Да еще актуально.
Цитата:
Сообщение от Pashan Посмотреть сообщение
1) У тебя в конструкторах классов указатели на массивы не инициализируются в NULL. Потом у тебя в некоторых методах (типа create) стоит вызов delete. Может быть, он и не выполнится, но по сути очень нехорошо.
Исправил. А про delete появился вопрос. Если я вызову new без предварительного delete? Это ведь тоже нехорошо?
Цитата:
Сообщение от Pashan Посмотреть сообщение
2) Зачем у тебя в деструкторах обнуляются все переменные? Это никому не нужная работа.
Привычка
А нет ли каких-нибудь ограничений на вложенность классов с динамическими массивами? Если я вмест класса CNeuroNet, делаю динамический массив типа CNeuronLayer - проблемм с памятью не возникает.
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 19.06.2009, 00:41   #5
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Ура!!! Разобрался. Просто нужно было изменить класс CNeuroNet:
Код:
class CNeuroNet
{
public:
	CNeuroNet();
	void create(CInitArray &);
	~CNeuroNet();
private:
	int kolLayer;
	CNeuronLayer *layer;
};
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 19.06.2009, 12:58   #6
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

Цитата:
А про delete появился вопрос. Если я вызову new без предварительного delete? Это ведь тоже нехорошо?
delete освобождает ВЫДЕЛЕННУЮ в программе память по указателю на нее. Изначально указатель будет указывать на фиг знает что. Или на NULL, если его корректно инициализировать. И что ты там удалять собрался?

Цитата:
А нет ли каких-нибудь ограничений на вложенность классов с динамическими массивами?
По идее никаких ограничений не должно быть. Хотя до конца не понял, что именно ты имеешь в виду
Pashan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
объект класса TBItmap albatros Мультимедиа в Delphi 3 27.03.2009 16:23
задача на объект Romer9999 Помощь студентам 9 27.02.2009 12:00