Questions d'un "mannequin - page 106

 
uncleVic:
La tâche... Veuillez joindre un module de signal (je n'en ai pas). Jetons un coup d'œil.
Dossiers :
 
openlive:

C'est encore plus bizarre. L'effet ne se produit pas pour moi.
 
uncleVic:

Encore plus bizarre. Je ne comprends pas l'effet.

effet seulement pendant l'initialisation, dans le testeur tout est normal

OK, je n'en ai pas besoin, je n'en ai pas vraiment besoin.

 

L'indicateur Zigzag lit des valeurs qui n'existent plus (elles devaient être là avant le redécoupage). Peut-on éviter cela ?

Si les valeurs sont dans la mémoire tampon, pourquoi ne se dessine-t-il pas à nouveau...

 

Bonjour, veuillez expliquer ce qui suit :

class Cbase
{
public:
        virtual ~Cbase(){};
        int k;
};

class Cchild:public Cbase
{
public:
        ~Cchild(){};
        double *p;
        int f;
};

J'ai deux classes, je crois que l'instance de génération suivante (base - child - child2 - ...), prend de plus en plus de place en mémoire. Pour l'opérateur New, nous disons exactement quelle quantité de mémoire allouer, en passant la classe en paramètres. Mais dans l'opérateur de suppression, nous ne disons pas exactement quelle quantité de mémoire allouer. En partant de ce raisonnement, on ne sait pas très bien ce qui va se passer dans la situation suivante :

void fn()
{
   Cbase *pClass;
   pClass = new Cchild;
   delete pClass;
   return;
}

Je veux dire que nous avons déclaré *pClass comme un pointeur vers Cbase (une petite classe comparée à Cchild), mais il pointe en fait vers Cchild. D'où la question : comment se comportera lafonction delete() ? Libèrera-t-il le nombre d'octets égal à la taille de Cbase (la mémoire sera alors encombrée), ou la suppression se fera-t-elle correctement ?

P.S : encore une question sur le sujet : y a-t-il une étiquette dans la zone de mémoire allouée (new), avec laquelle nous pouvons comprendre la taille de cette zone (quelque chose comme un char stocké avec un terminateur nul à la fin) ? Ou, en d'autres termes, un morceau de code qui ne sait rien de la taille des classes que j'ai déclarées peut-il libérer correctement de la mémoire ?

 

220Volt:

La question est de savoir comment se comportera lafonction delete(). Va-t-il libérer un nombre d'octets égal à la taille de la base C (la mémoire sera alors encombrée), ou la suppression se fera-t-elle correctement ?

Bien sûr, il libère correctement la mémoire.

P.S : encore une question sur le sujet : y a-t-il une étiquette dans la zone de mémoire allouée (new), par laquelle nous pouvons comprendre la taille de cette zone (quelque chose comme un char stocké avec un terminateur zéro à la fin) ? Ou, en d'autres termes, un fragment de code qui ne sait rien de la taille des classes que j'ai déclarées peut-il libérer correctement de la mémoire ?

sizeof ?
 
sergeev:

Bien sûr, il va supprimer correctement. Vous pouvez répartir les points de briques sur les destructeurs.

C'est à peu près l'origine de cette question. A fait à peu près comme décrit (le destructeur n'était pas virtuel), et les destructeurs en dessous de la classe du pointeur n'ont pas été appelés.
 
sergeev:
sizeof ?
Je pense que sizeof fonctionne au moment de la compilation, mais je parle de libérer la mémoire d'un autre processus par exemple. Si cela est possible, alors je pense que la fonction de suppression est compréhensible.
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
  • www.mql5.com
Основы языка / Операторы / Оператор уничтожения объекта delete - Документация по MQL5
 
Les destructeurs dans MQL5 sont toujours virtuels. Tout est supprimé correctement, essayez de mettre Print(__FUNCSIG__) ; dans les destructeurs.

class CFoo
  {
public:
   ~CFoo() { Print(__FUNCSIG__); }
  };

class CBar : public CFoo
  {
public:
   ~CBar() { Print(__FUNCSIG__); }
  };

void OnStart()
  {
   CFoo *f=new CBar();
   
   delete f;   
  }
 
La question ne porte plus sur ce que nous avons défini dans les fonctions de la classe via new, mais sur les données de la classe de ses membres "natifs". Après tout, ce ne sont pas non plus des espaces vides.
Raison: