Fragen von einem "Dummy" - Seite 106

 
uncleVic:
Aufgabe... Bitte legen Sie ein Signalmodul bei (ich habe keins). Schauen wir uns das mal an.
Dateien:
 
openlive:

Es ist sogar noch merkwürdiger. Die Wirkung tritt bei mir nicht ein.
 
uncleVic:

Noch merkwürdiger. Ich verstehe die Wirkung nicht.

Effekt nur während der Initialisierung, im Testgerät ist alles normal

OK, ich brauche es nicht, ich brauche es wirklich nicht.

 

Der Zickzack-Indikator liest Werte, die nicht mehr existieren (sie müssen vor dem Neuzeichnen vorhanden gewesen sein). Kann dies vermieden werden?

Wenn die Werte im Puffer sind, warum wird dann nicht wieder gezeichnet?

 

Guten Tag, bitte erklären Sie mir Folgendes:

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

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

Ich habe zwei Klassen, ich glaube, dass die nächste Generation Instanz (Basis - Kind - Kind2 - ...), nimmt mehr und mehr Platz im Speicher. Dem Operator New teilen wir genau mit, wie viel Speicher zugewiesen werden soll, indem wir die Klasse in Parametern übergeben. Beim Löschoperator wird jedoch nicht genau angegeben, wie viel Speicher zugewiesen werden soll. Ausgehend von dieser Überlegung ist nicht ganz klar, was in der nächsten Situation passieren wird:

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

D.h. ich meine, wir haben *pClass als Zeiger auf Cbase (eine kleine Klasse im Vergleich zu Cchild) deklariert, aber er zeigt tatsächlich auf Cchild. Daher die Frage: Wie wird sichdelete() verhalten? Wird die Anzahl von Bytes freigegeben, die der Größe von Cbase entspricht (dann wird der Speicher verstopft), oder wird die Löschung korrekt durchgeführt?

P.S.: Nun, eine weitere Frage zum Thema: Gibt es irgendeine Kennzeichnung im zugewiesenen Speicherbereich (neu), mit der wir die Größe dieses Bereichs verstehen können (so etwas wie char wird mit Nullterminator am Ende gespeichert)? Oder anders ausgedrückt, kann ein Stück Code, das nichts über die Größe der von mir deklarierten Klassen weiß, korrekt Speicher freigeben?

 

220Volt:

Die Frage ist, wie wird sichdelete() verhalten? Wird eine Anzahl von Bytes freigegeben, die der Größe von Cbase entspricht (dann wird der Speicher verstopft), oder wird das Löschen korrekt durchgeführt?

Natürlich wird dadurch der Speicher korrekt freigegeben.

P.S.: Nun, eine weitere Frage zu diesem Thema: Gibt es irgendeine Kennzeichnung im zugewiesenen Speicherbereich (neu), durch die wir die Größe dieses Bereichs verstehen können (so etwas wie ein Zeichen, das mit einem Nullterminator am Ende gespeichert wird)? Oder anders ausgedrückt: Kann ein Codefragment, das nichts über die Größe der von mir deklarierten Klassen weiß, korrekt Speicher freigeben?

sizeof ?
 
sergeev:

Natürlich wird es korrekt gelöscht. Sie können die Brickpoints auf die Destruktoren verteilen

Das ist in etwa der Punkt, auf den diese Frage hinausläuft. Ich habe es ungefähr so gemacht wie beschrieben (Destruktor war nicht virtuell), und Destruktoren unterhalb der Zeigerklasse wurden nicht aufgerufen.
 
sergeev:
sizeof ?
Ich denke, sizeof funktioniert zur Kompilierzeit, aber ich spreche zum Beispiel davon, Speicher von einem anderen Prozess freizugeben. Wenn dies möglich ist, dann wäre die Löschfunktion verständlich.
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
  • www.mql5.com
Основы языка / Операторы / Оператор уничтожения объекта delete - Документация по MQL5
 
Destruktoren in MQL5 sind immer virtuell. Alles wird korrekt gelöscht, versuchen Sie, Print(__FUNCSIG__); in Destruktoren zu setzen.

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

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

void OnStart()
  {
   CFoo *f=new CBar();
   
   delete f;   
  }
 
Die Frage ist nicht einmal mehr, was wir in den Klassenfunktionen über new eingestellt haben, sondern über die Klassendaten ihrer "nativen" Mitglieder. Schließlich sind auch sie keine leeren Räume.