MQL5 Der Compiler unterscheidet nicht zwischen einer Klasse und einem Zeiger auf sie - Seite 2

 
SemenTalonov:

Das hatte ich von der Kopie erwartet... Der Standard-Kopierkonstruktor ist kein Fehler.

AberDmitry sagt, dass ein neues Objekt im Speicher zugewiesen wird und ein Zeiger vom TypPOINTER_AUTOMATIC zurückgegeben wird.

Jeder versteht MQL-Macken auf seine eigene Weise)

Ja, es stellt sich heraus, dass es keinen Weihnachtsmann gibt.

Ich habe über kein Objekt im Speicher geschrieben.

OK, es gab einmal Streit darüber, wie man eine Referenz von einem Zeiger unterscheidet. Aber jetzt scheint es, dass wir ein Objekt nicht von einem Zeiger unterscheiden können.

 
Dmitry Fedoseev:

Woher kommt die Kopie eines Objekts? Eine Kopie eines Zeigers, ja, aber sie zeigt auf dasselbe Objekt.

Wir haben eine Reihe von Objekten. Ein Zuweisungsoperator wird auf dem ersten Element dieses Arrays aufgerufen, dem das separat erstellte Objekt übergeben wird (obwohl der Operator nicht deklariert ist). Was sollte Ihrer Meinung nach im ersten Element des Arrays danach stehen? Meiner Meinung nach sollte das Objekt erhalten bleiben.

 
SemenTalonov:

Ich will damit sagen, dass ein explizit deklarierter Kopierkonstruktor in diesem Test nichts ändern würde.

Wie kann man nur das Offensichtliche übersehen...

Ein Objekt-Array-Element enthält einen Zeiger und ein Objekt in der Zeiger-Array-Element... ist dies wirklich normal?

Im ersten Fall geht ein Objektzeiger in das Array, im zweiten Fall sollte der Kopierkonstruktor funktionieren, wie können diese Operationen gleichwertig sein?

Nicht der Kopierkonstruktor, sondern der Zuweisungsoperator, aber das sind nur Kleinigkeiten.

Es ist das Objekt, das in ein Element eines Objektarrays aufgenommen werden soll.

Im ersten Fall - Sie haben genau ein Objekt Array, welche Art von "Zeigern"?

 
Georgiy Merts:

Wir haben eine Reihe von Objekten. Der Zuweisungsoperator wird beim ersten Element dieses Arrays aufgerufen und das separat erstellte Objekt wird an ihn übergeben. Was sollte Ihrer Meinung nach im ersten Element dieses Feldes stehen? Meiner Meinung nach sollte das Objekt erhalten bleiben.

А... Dort ist es überhaupt nicht gut))) Ein Array mit automatischen Zeigern, in das sie auch ein dynamisch erstelltes Objekt packen. Dann gibt es 3 Objekte, von denen zwei automatisch gelöscht werden und eines undicht wird. Wenn sie kompiliert wird.

 

Das sollte so sein:

A* m_A[2];

und so:

m_A[0] =GetPointer(a); 
 

Und am Ende geht es so:

for(int i=0;i<2;i++)if(CheckPointer(m_A[i])==POINTER_DINAMIC)delete(m_A[i]); 
 
Dmitry Fedoseev:

А... Dort ist es überhaupt nicht gut))) Ein Array mit automatischen Zeigern, und sie fügen auch ein Objekt ein, das dynamisch erstellt wird.

Endlich!))

Georgiy Merts:

Es ist das Objekt, das in das Objekt-Array-Element eingefügt werden muss.

Im ersten Fall - Sie haben genau eine Reihe von Objekten, was "Zeiger"?

Das ist mein Punkt! Warum funktioniert es?!

m_A[1] = new A();
 
SemenTalonov:

Endlich!))

Das ist mein Punkt! Warum funktioniert es?!

Wenn A so erklärt wird:

A* m_A[2]; 

Dann ist es in Ordnung.

Und wenn es so erklärt wird:

A m_A[2]; 

Es sollte sich nicht kompilieren lassen. Entweder gibt es einen Fehler im Compiler, oder der Compiler muss nicht für jeden mitdenken.

 
Es ist wahrscheinlich kein Fehler, aber das Zuweisen von einfachen Objekten sollte funktionieren, so dass Sie darauf achten müssen, das Objekt zu löschen, das Sie mit new erstellt haben.
 
Dmitry Fedoseev:

Dann sollte es nicht kompiliert werden. Entweder gibt es einen Fehler im Compiler, oder der Compiler muss nicht für alle mitdenken.

Bingo!

SemenTalonov2019.01.10 07:36POINTER_AUTOMATIC in einem Zeiger vom TypPOINTER_DYNAMIC zu speichernund umgekehrt.
Grund der Beschwerde: