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.
p2->x
ist 0 nach malloc
) der Standardwert? Sollte ich erwartet haben? #include <stdlib.h>
für malloc
: P) Nein, p2- & gt; x kann nach dem Aufruf von malloc alles sein. Es ist nur 0 in Ihrer Testumgebung.
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%new ruft den Konstruktor auf, malloc nicht. Ihr Objekt befindet sich also in einem unbekannten Zustand.
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.
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.
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.
Tags und Links c++ memory-management malloc