Ошибки, баги, вопросы - страница 1874

 
Правильно ли в таком случае
class CLASS
{
public:
  ~CLASS()
  {
    static bool FirstRun = true;
    
    if (FirstRun && CheckPointer(&this) == POINTER_DYNAMIC)
    {
      FirstRun = false;
      
      delete &this;
    }
    
    Print(__FUNCSIG__);
  }
};

void OnStart()
{
  CLASS* Class = new CLASS;
  delete Class;
}

выдавать в журнал выполнения это?
void CLASS::~CLASS()
void CLASS::~CLASS()
delete invalid pointer


И правильно ли, что __FUNCSIG__ конструктора/деструктора выдает void-тип?

 
Koldun Zloy:

Попробуйте так:

Почему в Вашем варианте деструктор умного указателя вызывается раньше деструктора класса, а в моем - наоборот (даже если конструктор public)?
[Удален]  
fxsaber:

Мне нужно, чтобы существовал скрытый от всех объект. При этом другой объект такого типа нельзя было никак создать.


Это и называется: "Singleton".

Почему говорите, что он Вам не подходит?

Вот Пример синглтона.

template < typename T >
struct PTR
{
   T* Ptr;
   
   PTR() : Ptr( NULL ){}
   PTR( T* ptr ) : Ptr( ptr )
   {
   }
   
   ~PTR()
   {
      Print(__FUNCSIG__);
      if( Ptr )delete Ptr;
   }
   
   void Set( T* ptr )
   {
      Ptr = ptr;
   }
};

class CLASS
{
   static PTR< CLASS > sPtr;
   
   CLASS()
   {
      Print(__FUNCSIG__);
   }
   
public:
   ~CLASS()
   {
      Print(__FUNCSIG__);
   }
   
   static CLASS* GetPtr()
   {
      if( !sPtr.Ptr ){
         sPtr.Set( new CLASS );
      }
      return sPtr.Ptr;
   }
};

static PTR< CLASS > CLASS::sPtr;

void OnStart()
{
   CLASS* ptr = CLASS::GetPtr();
}
[Удален]  
fxsaber:
Правильно ли в таком случае
выдавать в журнал выполнения это?


И правильно ли, что __FUNCSIG__ конструктора/деструктора выдает void-тип?


Никогда не делайте

delete &this;
 
fxsaber:
Правильно ли в таком случае выдавать в журнал выполнения это?

И правильно ли, что __FUNCSIG__ конструктора/деструктора выдает void-тип?


Да, да.
 
Koldun Zloy:


Это и называется: "Singleton".

Почему говорите, что он Вам не подходит?

Вот Пример синглтона.

Огромное Спасибо, работает!

template < typename T >
struct PTR
{
   T* Ptr;
   
   PTR( void ) : Ptr(NULL)   
   {
   }
   
   PTR( T* ptr ) : Ptr(ptr)
   {
   }
   
   ~PTR( void )
   {
     if (this.Ptr)
       delete this.Ptr;
   }
   
   bool Set( T* ptr )
   {
      this.Ptr = ptr;
      
      return(true);
   }
   
   void operator =( bool )
   {
   }
};

class CLASS
{
private:   
   static PTR<CLASS> sPtr;
   
   CLASS()
   {
   }
   
public:
  static bool Set()
  {
    return(CLASS::sPtr.Ptr ? false : CLASS::sPtr.Set(new CLASS));
  }
};

static PTR<CLASS> CLASS::sPtr = CLASS::Set();

void OnStart()
{
}

Но так и осталось загадкой

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2017.04.25 10:34

Почему в Вашем варианте деструктор умного указателя вызывается раньше деструктора класса, а в моем - наоборот (даже если конструктор public)?
[Удален]  

Вероятно потому что Вы вызываете его вручную в функции OnStart().

Деструкторы статических объектов вызываются после этой функции в порядке обратном объявлению.

 
Koldun Zloy:

Вероятно потому что Вы вызываете его вручную в функции OnStart().

Деструкторы статических объектов вызываются после этой функции в порядке обратном объявлению.

Вроде, здесь же все корректно должно работать
template <typename T>
struct PTR
{
  T* Ptr;
  
  PTR( void )
  {
  }
  
  void operator =( T* &Value )
  {
    this.Ptr = Value;
  }
  
  ~PTR( void )
  {
    Print(__FUNCSIG__);
    delete this.Ptr;
  }
};

class CLASS
{
private:
  static PTR<CLASS> Ptr;
  static CLASS* Tmp;
  
  CLASS()
  {
    CLASS::Ptr = CLASS::Tmp;
  }
};

static PTR<CLASS> CLASS::Ptr;
static CLASS* CLASS::Tmp = new CLASS;

void OnStart()
{
}

Но утечка происходит. Где собака порылась?

[Удален]  
fxsaber:
Вроде, здесь же все корректно должно работать

Но утечка происходит. Где собака порылась?


Вы создаёте два объекта, а удаляете только один.

Зачем Вам нужен объект CLASS::Tmp?

 
Koldun Zloy:


Вы создаёте два объекта, а удаляете только один.

В каком месте создается два объекта?

Зачем Вам нужен объект CLASS::Tmp?

Благодаря Вам уже незачем. Но для понимания языка все же хочется понять, почему пример вызывает утечку.

Скрытые же объекты со скрытыми конструкторами бывают логичны в некоторых случаях (наверное, самый нагядный).