Was passiert mit Klassenmitgliedern, wenn malloc anstelle von new verwendet wird?

8

Ich studiere für eine Abschlussprüfung und bin auf eine seltsame Frage gestoßen, die Teil der Prüfung war, die unser Lehrer letztes Jahr einigen armen Seelen gab. Die Frage lautet etwa so:

  

Ist das folgende Programm korrekt oder nicht? Wenn dies der Fall ist, schreiben Sie auf, was das Programm ausgibt. Wenn nicht, notiere warum.

Das Programm:

%Vor%

Mein erster Instinkt war zu antworten mit "das Programm ist nicht korrekt, da new anstelle von malloc verwendet werden sollte". Nach dem Kompilieren des Programms und dem Anzeigen der Ausgabe 23 stelle ich jedoch fest, dass diese Antwort möglicherweise nicht korrekt ist.

Das Problem ist, dass ich erwartet habe, dass p2->get_x() eine beliebige Zahl zurückgibt (was auch immer an dieser Stelle des Speichers passiert ist, als malloc aufgerufen wurde). Es gibt jedoch 0 zurück. Ich bin mir nicht sicher, ob dies ein Zufall ist oder ob die Klassenmitglieder mit 0 initialisiert werden, wenn es malloc -ed ist.

  • Ist dieses Verhalten ( p2->x ist 0 nach malloc ) der Standardwert? Sollte ich erwartet haben?
  • Was würde Ihre Antwort auf die Frage meines Lehrers sein? (außer zu vergessen, #include <stdlib.h> für malloc : P)
Felix 26.05.2010, 15:11
quelle

5 Antworten

14
  • Ist dieses Verhalten (p2- & gt; x 0 nach malloc) der Standardwert? Sollte ich das erwartet haben?

Nein, p2- & gt; x kann nach dem Aufruf von malloc alles sein. Es ist nur 0 in Ihrer Testumgebung.

  • Was würdest du auf die Frage meines Lehrers antworten? (außer zu vergessen, für malloc # enthalten: P)

Was jeder gesagt hat, new kombiniert den Aufruf, Speicher vom Freestore mit einem Aufruf des Konstruktors des Objekts zu erhalten. Malloc macht nur die Hälfte davon.

Behebung: Während das Beispielprogramm falsch ist. Es ist nicht immer falsch, "malloc" mit Klassen zu verwenden. In einer Situation mit gemeinsam genutztem Speicher ist es absolut richtig, dass Sie nur einen direkten Anruf zu new hinzufügen müssen:

%Vor%     
jmucchiello 26.05.2010, 15:15
quelle
3

new ruft den Konstruktor auf, malloc nicht. Ihr Objekt befindet sich also in einem unbekannten Zustand.

    
Gregor Brandt 26.05.2010 15:12
quelle
1

Das tatsächliche Verhalten ist unbekannt, weil new ziemlich gleich verhält wie malloc + constructor call.

In Ihrem Code fehlt der zweite Teil, daher könnte es in einem Fall funktionieren, es konnte nicht, aber Sie können nicht genau sagen.

    
Costantino Rupert 26.05.2010 15:14
quelle
0

Warum kann 0 nicht auch eine beliebige Zahl sein? Laufen Sie im Debug-Modus? Welcher Compiler?

VC ++ füllt neu zugewiesenen Speicher mit einer Folge von 0xCC-Byte-Werten (im Debug-Modus natürlich) vor, so dass Sie keine Null für eine Antwort erhalten hätten, wenn Sie sie verwendet hätten.

    
Sandeep Datta 26.05.2010 15:17
quelle
0

Malloc garantiert nicht, dass der zugewiesene Speicher auf Null gesetzt wird und das Ergebnis des Programms nicht definiert ist.

Ansonsten gibt es viele andere Dinge, die dieses Programm davon abhalten, C ++ zu korrigieren. cout ist im Namespace std , malloc muss über #include <cstdlib> eingefügt werden, und iostream.h ist ebenfalls nicht standardkonform.

    
pmr 26.05.2010 15:17
quelle

Tags und Links