Erros, bugs, perguntas - página 1875

 

Provavelmente porque se chama manualmente na função OnStart().

Os destruidores de objectos estáticos são chamados após esta função por ordem inversa de declaração.

 
Koldun Zloy:

Provavelmente porque se chama manualmente na função OnStart().

Os destruidores de objectos estáticos são chamados após esta função por ordem inversa de declaração.

Parece que tudo deve funcionar correctamente aqui
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()
{
}

Mas a fuga ocorre de facto. Onde está o problema?

 
fxsaber:
Penso que tudo deve funcionar correctamente aqui

Mas a fuga está a acontecer. Onde está o problema?


Cria-se dois objectos e apaga-se apenas um.

Porque é que precisa de um objecto deCLASSE::Tmp?

 
Koldun Zloy:


Cria-se dois objectos e apaga-se apenas um.

Em que momento são criados dois objectos?

Porque é que precisa de um objecto deCLASSE::Tmp?

Graças a si, não há necessidade. Mas para compreender a língua, gostaria ainda de compreender porque é que o exemplo causa fugas.

Os objectos escondidos com construtores escondidos são lógicos em alguns casos, no entanto (provavelmente o mais difundido).

 

Sim, eu estava enganado. Tem apenas um objecto a ser criado e não eliminado.

Porque quando se chama o construtor

  CLASS()
  {
    CLASS::Ptr = CLASS::Tmp;
  }

CLASSE::Tmp ainda contém lixo, não o endereço do objecto.

 
1) A estrutura estática PTR<CLASS>ClASS::Ptr é criada;
2) a classe é criada, nova CLASSE; executa a construtora CLASSE()e CLASSE::Ptr é atribuído Null
3) CLASSE::O valor de Tmp é actualizado pelo ponteiro para nova CLASSE
4) Elimina PTR<CLASS> structure CLASS::Ptr; executa destruidor, tenta apagar CLASS::Ptr (é Null)
 
Koldun Zloy:

CLASSE::Tmp ainda contém lixo, não um endereço de objecto.

Obrigado! De alguma forma não reparei nesta obviedade.

Sergey Dzyublik:
1) Uma estrutura estática PTR<CLASS>ClASS::Ptr é criada;
2) Cria uma classe, nova CLASSE; gere CLASSE de construtor()eCLASSE::Ptr é atribuído Null
3) CLASSE::O valor de Tmp é actualizado pelo ponteiro para nova CLASSE
4) Elimina PTR<CLASS> structure CLASS::Ptr; executa destruidor, tenta apagar CLASS::Ptr (é Null)

Obrigado. Mas não é Null, é lixo.

 

Seria bom se a modalidade

ChartSetInteger( 0,CHART_SHOW,false );

não exibiriam setas de ofícios (entradas/saídas). Não há qualquer necessidade deles lá.

 
Rapazes, fora de questão temática, sou um novato, gostaria de encomendar um trabalho, agora tenho 0 no meu saldo, posso abrir um tema? ou tenho de carregar a minha conta no início? um pouco confuso quando eles bloqueiam dinheiro da minha conta...
 
The service is unavailable.
Desapareceu para uma tintura de valeriana...(