Fehler, Irrtümer, Fragen - Seite 1816

 
Mist13:

Ich bin auf ein (meiner Meinung nach) falsches Verhalten von Objektzeigern gestoßen.

Es sieht wie ein MQL-Fehler aus.

Sie haben den Fehler. Wie stellen Sie sich vor, einem Nachkommen einen leeren Elternteil zuzuweisen?

 
fxsaber:

Es sieht wie ein MQL-Fehler aus.

Sie haben den Fehler. Wie stellen Sie sich vor, einem Nachkommen einen leeren Elternteil zuzuweisen?

Das ist genau dasselbe wie ein nicht leerer. Das baseObj1 enthält einen Zeiger auf das Objekt der Nachfolgeklasse. Wenn Sie delete(obj1) entfernen, verursacht die Zuweisung in der letzten Zeile keine Probleme - die Zeigertypen stimmen überein. Ich denke, die Zuweisung muss auf die gleiche Weise erfolgen, wenn das Objekt, auf das sich der Zeiger bezieht, gelöscht wird. Und es sollte auch kein Fehler "Ungültiger Zeigerzugriff" auftreten - es wird nicht versucht, auf ein gelöschtes Objekt zuzugreifen.
 
Mist13:
Genau dasselbe wie nicht-leer. In baseObj1 befindet sich ein Zeiger auf ein Objekt der Klasse descendant. Wenn Sie delete(obj1) entfernen, verursacht die Zuweisung in der letzten Zeile keine Probleme - die Zeigertypen stimmen überein. Ich denke, die Zuweisung muss auf die gleiche Weise erfolgen, wenn das Objekt, auf das sich der Zeiger bezieht, gelöscht wird. Und es darf kein Fehler "Ungültiger Zeigerzugriff" auftreten, da nicht versucht wird, auf ein gelöschtes Objekt zuzugreifen.
Dieser Teil Ihres Codes
obj2 = baseObj1;//Пока не грохнули объект - no problem
Wie kann sie aus Ihrer Sicht architektonisch umgesetzt werden?
 
       obj2 = dynamic_cast<B *>( baseObj1 );//нормально
Ein solches Casting ist, wenn überhaupt, nur möglich, wenn das Basisobjekt existiert.
 
Und wie lade ich nach der Aktualisierung Dateien in den Markt hoch?
 
fxsaber:
Hier ist dieser Teil des Codes.
obj2 = baseObj1;//Пока не грохнули объект - no problem
Wie kann das aus Ihrer Sicht architektonisch umgesetzt werden?

Offenbar wird geprüft, ob der Typ des Objekts, auf das baseObj1 verweist, mit dem Typ des Zeigers obj2 übereinstimmt. Hier gibt es zwei Möglichkeiten:

1) Der Zeiger selbst kann eine komplexe Struktur sein, die den Typ des Objekts enthält

2) Wir müssen uns auf das Objekt beziehen, um seinen Typ herauszufinden.

Dies scheint Fall Nr. 2 zu sein, und wir werden damit leben müssen. Danke für die Leitfragen )

 

Kaspersky schreit schon seit einer Woche auf dem Terminal und versucht, ein Update durchzuführen.

 
fxsaber:
Dieser Teil Ihres Codes
obj2 = baseObj1;//Пока не грохнули объект - no problem
Wie kann das aus Ihrer Sicht architektonisch umgesetzt werden?

Dasselbe wie hier.

class A {};
class B : public A {};
class C : public B {};
void OnStart()
{
        B *b = new B;
        delete b;
        B *c = b;
        b = new C;
        A *a = c;
        Print( a, ":", b, ":", c );
}
 
A100:
Genau wie hier.
class A {};
class B : public A {};
void OnStart()
{
        B *b1 = new B;
        A *a = b1;    
        delete b1;
        B *b2 = b1;
        b1 = new B; //уже другой объект
        a = b2;     //
        Print( a, ":", b1, ":", b2 );
}
Wo?
b1 = a;
 
vladavd:

Kaspersky schreit schon seit einer Woche auf dem Terminal und versucht, ein Update durchzuführen.

keine Panik!)

Entwarnung, Build 1545. auch Kaspersky sagt Entwarnung
https://www.virustotal.com/ru/file/2c3bf04666714cfac26e6e1c0fe355c6081554a0c2a15434849b0a5c241c95b0/analysis/1487685060/








Antivirus scan for 2c3bf04666714cfac26e6e1c0fe355c6081554a0c2a15434849b0a5c241c95b0 at 2017-02-21 13:51:00 UTC - VirusTotal
  • www.virustotal.com
Condensed report! The following is a condensed report of the behaviour of the file when executed in a controlled environment. The actions and events described were either performed by the file itself or by any other process launched by the executed file or subjected to code injection by the executed file. Opened files C:\Documents and...