Erreurs, bugs, questions - page 1875

 
Koldun Zloy:

Probablement parce que vous l'appelez manuellement dans la fonction OnStart().

Les destructeurs d'objets statiques sont appelés après cette fonction dans l'ordre inverse de la déclaration.

Il semble que tout devrait fonctionner correctement ici
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()
{
}

Mais les fuites se produisent. Où est le problème ?

 
fxsaber:
Je pense que tout doit fonctionner correctement ici

Mais la fuite a lieu. Où est le problème ?


Vous créez deux objets et en supprimez un seul.

Pourquoi avez-vous besoin de l'objetCLASS::Tmp ?

 
Koldun Zloy:


Vous créez deux objets et en supprimez un seul.

A quel moment deux objets sont-ils créés ?

Pourquoi avez-vous besoin d'un objetCLASS::Tmp ?

Grâce à vous, ce n'est pas nécessaire. Mais pour comprendre le langage, j'aimerais encore comprendre pourquoi l'exemple provoque des fuites.

Les objets cachés avec des constructeurs cachés sont cependant logiques dans certains cas (probablement le plus répandu).

 

Oui, je me suis trompé. Un seul objet est créé et n'est pas supprimé.

Parce que lorsque vous appelez le constructeur

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

CLASS::Tmp contient toujours des déchets, pas l'adresse de l'objet.

 
1) La structure static PTR<CLASS> CLASS::Ptr est créée ;
2) la classe est créée, new CLASS ; elle exécute le constructeur CLASS()et CLASS::Ptr est assigné Null
3) La valeur de CLASS::Tmp est mise à jour par le pointeur vers le nouveau CLASS
4) Supprime la structure PTR<CLASS> CLASS::Ptr ; exécute le destructeur, essaie de supprimer CLASS::Ptr (il est Null)
 
Koldun Zloy:

CLASS::Tmp contient toujours des déchets, pas l'adresse d'un objet.

Merci ! Je n'ai pas remarqué cette évidence.

Sergey Dzyublik:
1) Une structure statique PTR<CLASS> CLASS::Ptr est créée ;
2) Crée une classe, new CLASS ; exécute le constructeur CLASS()etattribue à CLASS::Ptr la valeur Null.
3) La valeur de CLASS::Tmp est mise à jour par le pointeur vers le nouveau CLASS
4) Supprime la structure PTR<CLASS> CLASS::Ptr ; exécute le destructeur, essaie de supprimer CLASS::Ptr (il est Null)

Merci. Mais ce n'est pas Null, c'est un déchet.

 

Il serait bon que le mode

ChartSetInteger( 0,CHART_SHOW,false );

n'affichait pas les flèches des transactions (entrées/sorties). Ils n'ont pas du tout besoin d'être là.

 
Les gars, question hors sujet, je suis un débutant, je voudrais commander un travail, maintenant j'ai 0 sur mon solde, puis-je ouvrir un thème ? ou dois-je recharger mon compte au début ? un peu confus quand ils bloquent l'argent de mon compte ...
 
The service is unavailable.
Je suis allé chercher de la teinture de valériane...(
 
Erreur de compilation
struct STRUCT
{
  long l;
  
  STRUCT( void )
  {
  }
};

union UNION
{
  STRUCT Value; // 'STRUCT' has constructor and cannot be used as union member
};