Errores, fallos, preguntas - página 1875

 

Probablemente porque lo llamas manualmente en la función OnStart().

Los destructores de los objetos estáticos se llaman después de esta función en orden inverso a la declaración.

 
Koldun Zloy:

Probablemente porque lo llamas manualmente en la función OnStart().

Los destructores de los objetos estáticos se llaman después de esta función en orden inverso a la declaración.

Parece que todo debería funcionar correctamente aquí
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()
{
}

Pero la fuga se produce. ¿Dónde está el problema?

 
fxsaber:
Creo que todo debe funcionar correctamente aquí

Pero la fuga está ocurriendo. ¿Dónde está el problema?


Se crean dos objetos y se elimina sólo uno.

¿Por qué necesitas el objetoCLASS::Tmp?

 
Koldun Zloy:


Se crean dos objetos y se elimina sólo uno.

¿Dónde se crean dos objetos?

¿Por qué necesitas un objetoCLASS::Tmp?

Gracias a ti ya no es necesario. Pero para entender el lenguaje, todavía me gustaría entender por qué el ejemplo provoca fugas.

Sin embargo, los objetos ocultos con constructores ocultos son lógicos en algunos casos (probablemente el más generalizado).

 

Sí, me he equivocado. Sólo tiene un objeto que se crea y no se borra.

Porque cuando se llama al constructor

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

CLASS::Tmp sigue conteniendo basura, no la dirección del objeto.

 
1) Se crea la estructura estática PTR<CLASS> CLASS::Ptr;
2) se crea la clase, new CLASS; se ejecuta el constructor CLASS()y se le asigna Null a CLASS::Ptr
3) El valor de CLASS::Tmp se actualiza con el puntero a la nueva CLASS
4) Borra la estructura PTR<CLASS> CLASS::Ptr; ejecuta el destructor, intenta borrar CLASS::Ptr (es Null)
 
Koldun Zloy:

CLASS::Tmp sigue conteniendo basura, no una dirección de objeto.

Gracias. Por alguna razón no me di cuenta de esta obviedad.

Sergey Dzyublik:
1) Se crea una estructura estática PTR<CLASS> CLASS::Ptr;
2) Crea una clase, new CLASS; ejecuta el constructor CLASS()y aCLASS::Ptr se le asigna Null
3) El valor de CLASS::Tmp se actualiza con el puntero a la nueva CLASS
4) Borra la estructura PTR<CLASS> CLASS::Ptr; ejecuta el destructor, intenta borrar CLASS::Ptr (es Null)

Gracias. Pero no es Null, es basura.

 

Sería bueno que el modo

ChartSetInteger( 0,CHART_SHOW,false );

el modo no mostraría las flechas de las operaciones (entradas/salidas). No hay ninguna necesidad de que estén allí.

 
Chicos, pregunta fuera de tema, soy novato, me gustaría pedir un trabajo, ahora tengo 0 en mi saldo, ¿puedo abrir un tema? o tengo que recargar mi cuenta al principio? un poco confundido cuando bloquean el dinero de mi cuenta...
 
The service is unavailable.
Fui por una tintura de valeriana...