Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Cбой в программе, сбой при вызове деструктора  
:(
    Опции темы
sergioK
Дата 2.1.2011, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



вот классы 
Код

#include <iostream>
#include <string>
using namespace std;

typedef  string String;
enum Coulisse{NotDefined, Standard=1,Auto=2,Tiptronic=4,DoubleWeels=8};

//interface
class IGear {
  public:
    virtual ~IGear(){};
    virtual void switch_on() = 0;
    virtual Coulisse getLocation()=0;
};

class AbstractGear : public IGear {
  public:

    virtual ~AbstractGear(){};
    virtual void switch_on() {
        cout<<status<<endl;
    }
     virtual Coulisse getLocation(){
     // int status = Coulisse(0);
     cout<<" \n\t\t Gear position is " <<endl;
     return status;
    }

  protected :
    void setLocation(Coulisse c){
     status=c;
 }
    Coulisse status;
};
//non pur abstract class
class DecoratorGear : public IGear{
public:
    DecoratorGear(IGear * inner){
        gear = inner;
    }
     ~DecoratorGear(){
        //if(gear!=0){
        cout << "Start release memory" << '\n';
        delete gear;  // error here 
        cout << "finish release memory" << '\n';
        //}
    };
    virtual  void setLocation(Coulisse c)=0;

    virtual void switch_on(){
        cout << "Gear switched on ";
        gear->switch_on();
    }

    void setMessage(String message){
        this->message = message;
    }

private:
    String message;
    IGear *gear;

protected:
    Coulisse status;
    IGear* getGear(){
        return gear;
    }
};

class StandardGear: public AbstractGear {
  public:
    StandardGear() {
    }
    ~StandardGear() {
        cout << "\nStardard Gear destroy" << '\n';
    }
    void switch_on() {
   /*    cout << "\nswitch on " << '\n';
     gear->switch_on();
     cout << "\nSswitch on " << '\n';
    */}


   private:
      AbstractGear *gear;
};


class AutomaticGear: public AbstractGear {

  public:
    AutomaticGear() {
        this->gear = gear;
        AbstractGear::setLocation(Coulisse(2));
    }
    ~AutomaticGear() {
        delete gear;
    }
    /*virtual*/
    void switch_on() {
        //gear->switch_on();
    }
  private:
    DecoratorGear *gear;
};


class TipTronicGear : public DecoratorGear {
  public:
    TipTronicGear(IGear * gear) : DecoratorGear(gear){

    }
     ~TipTronicGear() {
        cout << "TipTronicGear destroy " << endl;
    }
    virtual void setLocation(Coulisse status){
     this->status= status;
    }
    virtual Coulisse getLocation(){
     return status;
    }

    void switch_on() {
        getGear()->switch_on();
        status=Coulisse(4);
        cout << "TipTronicGear switched on ";
    }
};




вот майн 
Код

    IGear *standardGear=new StandardGear();
    IGear *tiptronicGear = new TipTronicGear(standardGear);
    tiptronicGear->switch_on();
    cout<< tiptronicGear->getLocation()<<endl;
    cout<<" 22222222222"<<endl;

    delete standardGear;
  delete tiptronicGear;      // вот тут происходит ошибка ????


что Я делаю не так при очистке памяти ?, на Мanaged code не писал с 99года, 
в дебаге в момент стирания памяти создаеться доп сред и появдаеться файл с ассемблерным кодом ,


PM MAIL   Вверх
586
Дата 2.1.2011, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Объект StandardGear, который создан в main() в строке 1, удаляется дважды: первый раз - в main() (строка 7), второй - в классе DecoratorGear (строка 44).









Это сообщение отредактировал(а) 586 - 2.1.2011, 10:07
PM   Вверх
sergioK
Дата 2.1.2011, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Цитата(586 @ 2.1.2011,  09:43)
standardGear удаляется дважды: первый раз - в main() (строка 7), второй - в классе DecoratorGear (строка 44).


т,e 
т,е, количество deletes должно быть равно количеству new ???


Это сообщение отредактировал(а) sergioK - 2.1.2011, 11:23
PM MAIL   Вверх
Sosed
Дата 2.1.2011, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.8.2009

Репутация: 1
Всего: 1



если после delete указатели не зануляются
PM MAIL   Вверх
sergioK
Дата 2.1.2011, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Цитата(Sosed @ 2.1.2011,  12:26)
если после delete указатели не зануляются

а если зануляються то что ? выскочит exception ?

PM MAIL   Вверх
Dem_max
Дата 2.1.2011, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



после delete  нужно указателю присвоить NULL 


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Sosed
Дата 2.1.2011, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.8.2009

Репутация: 1
Всего: 1



Цитата
Цитата
если после delete указатели не зануляются

а если зануляються то что ? выскочит exception ?

Поглядывая на стандарт, и указатель на NULL, ничего не произойдет)
Обычно рекомендуют:
Код

delete ptr;
ptr = NULL;
...
delete ptr; //ok


Это сообщение отредактировал(а) Sosed - 2.1.2011, 15:17
PM MAIL   Вверх
sergioK
Дата 2.1.2011, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Цитата(Dem_max @ 2.1.2011,  13:58)
после delete  нужно указателю присвоить NULL


т,е , 
Код


 AnyClass anyClass = new AnyClass();
 ..... 
......
.....

 delete anyClass; // вызывая деструктор 
  anyClass = NULL  


1) для чего 
2) NULL или 0 ?
3) могу Я чистить память free чоть это не это не С++ (so what?)  ведь delete все равно вызовет free ,
    в тех случаях когда мне не нужно вызывать дестрактор ?


PM MAIL   Вверх
Alexeis
Дата 2.1.2011, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(sergioK @  2.1.2011,  18:55 Найти цитируемый пост)
2) NULL или 0 ?

  Для указателя NULL, для Windows дескриптора 0. Физически это одно и тоже, но логически правильно указателю присваивать NULL.

Цитата(sergioK @  2.1.2011,  18:55 Найти цитируемый пост)
3) могу Я чистить память free чоть это не это не С++ (so what?)  ведь delete все равно вызовет free ,
    в тех случаях когда мне не нужно вызывать дестрактор ?

  Каждому new должен соответствовать delete, каждому new[] delete[], malloc - free . Если делать не так, то произойдет неизвестно что. Зачастую new выделяет памяти больше чем нужно и возвращает не указатель на начало блока, а на смещение внутри блока, тогда как free захочет начало блока.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
sergioK
Дата 2.1.2011, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Цитата(Alexeis @ 2.1.2011,  18:42)
Цитата(sergioK @  2.1.2011,  18:55 Найти цитируемый пост)
2) NULL или 0 ?

  Для указателя NULL, для Windows дескриптора 0. Физически это одно и тоже, но логически правильно указателю присваивать NULL.

 
т,е, если его обнулить то delete  его просто проигноирует ?
это типа  защита от дураков  smile ?
PM MAIL   Вверх
azesmcar
Дата 2.1.2011, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(sergioK @  2.1.2011,  20:26 Найти цитируемый пост)
т,е, если его обнулить то delete  его просто проигноирует ?

Да, но я бы не стал так делать. Присваивать стоит только в том случае, когда двойное удаление ожидается, а не присваивать всегда, чтобы избежать ошибки. Это все равно, что ловить все исключения и ничего не делать. Лучше уж пусть программа даст сбой, чем работает черт знает как. За двойным удалением скорее всего скрывается какая нибудь логическая ошибка и не надо ее маскировать нулевым указателем.

Добавлено через 31 секунду
Всех с новым годом кстати smile 
Первое сообщение в 2011-ом

Добавлено через 4 минуты и 29 секунд
sergioK

Вообще возьми за правило очищать память на том уровне, на котором было выделение. Код будет логичнее и чище и подобных проблем будет меньше.
PM   Вверх
sergioK
Дата 3.1.2011, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Цитата(azesmcar @ 2.1.2011,  22:29)
Вообще возьми за правило очищать память на том уровне, на котором было выделение. Код будет логичнее и чище и подобных проблем будет меньше.

разобрался  всем спасибо,

Это сообщение отредактировал(а) sergioK - 3.1.2011, 01:10
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0568 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.