Re[2]: Удалить обьект из себя???
От: Анатолий Широков СССР  
Дата: 21.09.04 14:46
Оценка: 6 (2)
LVV>А зачем такие извраты? Цель какова? Может оно и не нужно вовсе? Или только спортивный интерес?

Например, для реализации подсчета ссылок и автоматического удаления, как в COM:


struct IUnknow
{
    ...
    virtual long AddRef() = 0;
    virtual long Release() = 0;
};


Семантика метода Release такова, что когда счетчик клиентов использующих объект станет равным 0 объект себя удалит.
Re: Удалить обьект из себя???
От: prVovik Россия  
Дата: 21.09.04 21:04
Оценка: 1 (1)
Здравствуйте, <Аноним>, Вы писали:

А>Привет!!!


А>Хотел спросить можна ли удалять обьект из внутри себя, безопасно ли это или правильно будут вызваны деструкторы обьекта то есть имееться ввиду что то типа такого:


А>

А>class A
А>{
А>private:
А>public:
А>A();
А>virtual ~A();
А>};

А>class B : public A
А>{
А>private:

А>public:
А>B();

А>void Delete();

А>vitual ~B();
А>};

А>//...

А>void B::Delete()
А>{
А>//...
А>delete this; //Можна ли так???
А>//Дальше нету обращений к обьекту...
А>};

А>


А>Спасибо!!!


Нет, так делать нельзя.
Надо деструктор класса B сделать защищенным. Иначе будут грабли, когда объект создастся на стеке.
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re: Удалить обьект из себя???
От: LaptevVV Россия  
Дата: 21.09.04 14:40
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>Привет!!!


А>Хотел спросить можна ли удалять обьект из внутри себя, безопасно ли это или правильно будут вызваны деструкторы обьекта то есть имееться ввиду что то типа такого:


А>

А>class A
А>{
А>private:
А>public:
А>A();
А>virtual ~A();
А>};

А>class B : public A
А>{
А>private:

А>public:
А>B();

А>void Delete();

А>vitual ~B();
А>};

А>//...

А>void B::Delete()
А>{
А>//...
А>delete this; //Можна ли так???
А>//Дальше нету обращений к обьекту...
А>};

А>

А зачем такие извраты? Цель какова? Может оно и не нужно вовсе? Или только спортивный интерес?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Удалить обьект из себя???
От: Аноним  
Дата: 21.09.04 14:32
Оценка:
Привет!!!

Хотел спросить можна ли удалять обьект из внутри себя, безопасно ли это или правильно будут вызваны деструкторы обьекта то есть имееться ввиду что то типа такого:


class A
{
private:
public:
A();
virtual ~A();
};

class B : public A
{
private:

public:
B();

void Delete();

vitual ~B();
};

//...

void B::Delete()
{
//...
delete this; //Можна ли так???
//Дальше нету обращений к обьекту...
};


Спасибо!!!
Re: Удалить обьект из себя???
От: Bell Россия  
Дата: 21.09.04 14:43
Оценка:
Здравствуйте, Аноним, Вы писали:

Можно.
Любите книгу — источник знаний (с) М.Горький
Re: Удалить обьект из себя???
От: Glоbus Украина  
Дата: 21.09.04 14:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет!!!


А>Хотел спросить можна ли удалять обьект из внутри себя, безопасно ли это или правильно будут вызваны деструкторы обьекта то есть имееться ввиду что то типа такого:


А>Спасибо!!!


Можно. в СОМ например объекты там и делают. то же самое для реализации коласса треда можно слделать типа пишем (new Thread()).Run() а в конце метода тред делает делет самое себя
Удачи тебе, браток!
Re[2]: Удалить обьект из себя???
От: Glоbus Украина  
Дата: 21.09.04 14:47
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>А зачем такие извраты? Цель какова? Может оно и не нужно вовсе? Или только спортивный интерес?


COM например
Удачи тебе, браток!
Re: Удалить обьект из себя???
От: jazzer Россия Skype: enerjazzer
Дата: 21.09.04 14:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>

А

А>void B::Delete()
А>{
А>//...
А>delete this; //Можна ли так???
А>//Дальше нету обращений к обьекту...
А>};

А>


Если действительно нет дальше обращений и эта функция не вызвана из другой функции, в которой дальше будут обращения — нормально
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Удалить обьект из себя???
От: Bell Россия  
Дата: 22.09.04 06:31
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Нет, так делать нельзя.

V>Надо деструктор класса B сделать защищенным. Иначе будут грабли, когда объект создастся на стеке.

И что, сам по себе защищенный деструктор убережет нас от создания объектов на стэке? А как насчет наследования?

ЗЫ
Если уж начал говорить о проблеме, то расскажи подробнее — что, и почему — как решается пробрема с оозданием и разркушением таких объектов, зачем и когда это нужно, и т.д.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Удалить обьект из себя???
От: Аноним  
Дата: 22.09.04 07:44
Оценка:
V>Нет, так делать нельзя.
V>Надо деструктор класса B сделать защищенным. Иначе будут грабли, когда объект создастся на стеке.

Интересный случай! То есть получаеться что деструктор вызветься дважды, получаеться что деструктор либо нужно сделать пустым или что бы он автоматически не вызывался... Об этом как то и не подумал... Спасибо!!!
Re[3]: Удалить обьект из себя???
От: jazzer Россия Skype: enerjazzer
Дата: 22.09.04 07:49
Оценка:
Здравствуйте, Аноним, Вы писали:

V>>Нет, так делать нельзя.

V>>Надо деструктор класса B сделать защищенным. Иначе будут грабли, когда объект создастся на стеке.

А>Интересный случай! То есть получаеться что деструктор вызветься дважды, получаеться что деструктор либо нужно сделать пустым или что бы он автоматически не вызывался... Об этом как то и не подумал... Спасибо!!!


Дело не в этом, а в том, что this в этом случае не является указателем на участок памяти, выделенный с помощью new.
Соответственно применять к нему delete никак нельзя.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Удалить обьект из себя???
От: Bell Россия  
Дата: 22.09.04 07:51
Оценка:
Здравствуйте, Аноним, Вы писали:

V>>Нет, так делать нельзя.

V>>Надо деструктор класса B сделать защищенным. Иначе будут грабли, когда объект создастся на стеке.

А>Интересный случай! То есть получаеться что деструктор вызветься дважды, получаеться что деструктор либо нужно сделать пустым или что бы он автоматически не вызывался... Об этом как то и не подумал... Спасибо!!!


Вот они, плоды недосказанности
Любите книгу — источник знаний (с) М.Горький
Re[4]: Удалить обьект из себя???
От: Аноним  
Дата: 23.09.04 11:21
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Аноним, Вы писали:


V>>>Нет, так делать нельзя.

V>>>Надо деструктор класса B сделать защищенным. Иначе будут грабли, когда объект создастся на стеке.

А>>Интересный случай! То есть получаеться что деструктор вызветься дважды, получаеться что деструктор либо нужно сделать пустым или что бы он автоматически не вызывался... Об этом как то и не подумал... Спасибо!!!


J>Дело не в этом, а в том, что this в этом случае не является указателем на участок памяти, выделенный с помощью new.

J>Соответственно применять к нему delete никак нельзя.

А что если в обьект передать указатель который был получен через new и удалять его — так можно?



class A
{
private:
public:
A();
virtual ~A();
};

class B
{
private:
   B* m_this;
public:
   B(B* x_this);
   void Delete();
   virtual ~B();
};

B::B(B* x_this)
{
   m_this=x_this;
}

void B::Delete()
{
   if(m_this!=NULL)
   {
      delete m_this;
      m_this=NULL;
   };
}

B::~B()
{
   if(m_this!=NULL)
   {
      //... то есть можна вызывать деструктор
   }
}
Re[2]: Удалить обьект из себя???
От: hrendler Россия N/A
Дата: 23.09.04 11:28
Оценка:
Здравствуйте, prVovik, Вы писали:
V>Нет, так делать нельзя.
V>Надо деструктор класса B сделать защищенным. Иначе будут грабли, когда объект создастся на стеке.

это легко обходится защищенным конструктором и фабрикой
... << RSDN@Home 1.1.3 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.