C++ Frage

darktrym

Fahnenträger
Hallo,
morgen beginnt bei mir ein Proseminar, dass sich mit Bewertung und Implementation von Protokollfunktionen beschäftigt. Die Simulationsumgebung ist omnet und programmiert wird in C++. Ich habe hier ein Codestück gegeben, wozu Vorbereitungsfragen gestellt wurden sind.

Code:
cMessage msg;
msg.setName("Message");
delete &msg;

Bin leider nicht der große Zen der C++ Programmierung, darum kann ich die Fragen nicht eindeutig/vollständig beantworten.

Fragen:

1) Wird der Code stets korrekt laufen? Begründung!
2) Typen von msg, &msg und Zweck von delete!

Antworten:
1) es scheint so, dass das Objekt nicht im Heap abgelegt wird; Dann dürfte delete nicht funktionieren; nur bekomme ich keinerlei Fehlermeldungen oder Warnungen, also wann funkt. der Code nicht?
2) msg Typ cMessage, &= Referenzoperator und delete zum Entfernen dyn. Objekte(die auf dem Heap abgelegt sind)

Weitere Eingebungen von euch?
 
msg liegt im Stack, da darf man überhaupt kein delete drauf anwenden. Das ist ein massiver Programmierfehler. Ob der Compiler das so annimmt, ob es einem zur Laufzeit um die Ohren fliegt, oder ob man es gar nicht bemerkt, kann ich nicht sagen. Ich bin noch nie auf die Idee gekommen Stackspeicher freizugeben. Da es dir nicht um die Ohren fliegt, würde ich sagen, der Compiler optimiert das blödsinnige delete weg.

In C++ kannst du dich nicht darauf verlassen, dass eine Klasse einen Konstruktor hat, es sei denn du musst beim Anlegen schon Parameter übergeben. Es ist also gut möglich, dass msg voller Datenmüll ist und erst einmal von außen in einen konsistenten Zustand versetzt werden muss.

msg ist ein Objekt vom Type cMessage, im Stack (da kann man in Java zum Beispiel gar keine Objekte hin tun).
&msg ist ein Pointer vom Typ cMessage*.
Mit delete gibt man Speicher vom Heap frei. Aber msg liegt ja auf dem Stack. Sehr blödsinnig, wie gesagt.

Zur Frage 1), kann ich mir nicht vorstellen. Selbst wenn man das delete weg lässt muss man cMessage kennen um das beurteilen zu können.
 
Dann bedank ich mich mal und ich werde dann morgen sehen, was meine Kollegen so fabriziert haben.
Irgendwie kommt Vorfreude auf, wieder auf alten Solaris Tastaturen einzuhacken. OLD STYLE.
 
An und für sich stimme ich Kamikaze zu!
Ich hatte auch mal irgendwann das Problem, dass irgendwer delete auf nem
im Stack abgelegten Objekt aufgerufen hat. GCC meckert da nichtmal rum
und wegoptimiert wurde da garnichts, stattdessen zur Laufzeit nen schönen
Segmentation-Fault.
 
Einfache Regel: Da wo ein new ist, muß auch ein delete folgen.

In deinem Beispiel ist das nicht der Fall, da das Objekt lokal erzeugt wurde. (Stack gibt es laut C++-Norm als Begriff nicht, ist wohl nur bei C so)
Was bei dem delete &msg; passieren wird, ist laut C++-Standard undefiniert. Da es von der Implementierung der C++-Runtime abhängt. Es kann z.B. sein, das die Runtime einfach weiter läuft. Es kann aber auch sein, das eine Exception geworfen wird (was meistens der Fall ist).

Hier mal ein paar nützliche Infos:
http://www.kharchi.eu/wiki/doku.php?id=cpp:std:objects
 
Last edited:
Da gabs 5 Fragen, alle leicht zu beantworten und wer hat ^^ Frage bekommen. Der Betreuer hat die Antwort abgenickt. Muss wohl gestimmt haben, er hat es auch mit dem Stack begründet, vielleicht auch nur weil ich das zuvor gesagt hatte.

Zu den Sparc Rechner waren alles Ultra 5 mit 333mhz,128mb RAM, 9gb Festplatte und Solaris 8. Wäre mal interessant zu wissen, wann die Uni die angeschafft hat und warum.
 
Back
Top