lokale Pointer
-
Hallo C++-Freunde,
Kann mir einer von euch mal den Unterschied zwischen
diesen beiden Code-Fragmenten sagen?Fragment 1:
SQueue<QString> q; QString* s1 = new QString("Hallo1"); QString* s2 = new QString("Hallo2"); q.put(s1); Logger::debug(*q.get()); q.put(s2); Logger::debug(*q.get());
Fragment 2:
SQueue<QString> q2; q2.put(new QString("Hallo1")); Logger::debug(*q2.get()); q2.put(new QString("Hallo2")); Logger::debug(*q2.get()); // Prozess abgebrochen
Ich dachte immer, dass diese äquivalent sind,
allerdings stürzt das zweite Fragment in der
letzten Zeile ab. Warum? Mit nem anderen Objekt-Typ
funktioniert es...
Die Zeiger die aus dem Queue zurückgegeben werden sind
gleich s1 bzw. s2.SQueue ist ein selbst geschriebenes Template, aber
das sollte doch egal sein, oder?Ich bin zur Zeit ratlos...
Ich hoffe einer kann mir helfen.
Gruß,
CSpille
-
Was hat denn get() für eine Rückgabetyp?
Ansonsten Logger::debug debuggen und schauen, wo das Programm abstürzt.
-
get hat den Rückgabe-Typ: type* (also hier QString*)
Du meinst also der Fehler ist in Logger:debug?
Öhm...
Den hab ich zwar auch selbst geschrieben (somit eine potentielle
Fehlerquelle), aber es sollte doch in beiden Fällen, der gleiche Pointer
übergeben werden, oder? Deshalb sollte er doch dann auch in beiden
Fällen abstürzen, oder?Sind die Codefragmente denn jetzt äquivalent?
Gruß,
CSpille
-
CSpille schrieb:
Sind die Codefragmente denn jetzt äquivalent?
Der Unterschied ist, daß das erste zwei zusätzliche Variablen auf dem Stack erstellt.
Möglicherweise verwendet die debug-Funktion lokale, uninitialisierte Variablen, deren Wert je nachdem, wo sie auf dem Stack entstehen, variiert, und die Funktion stürzt nur durch (glücklichen?) Zufall beim ersten Mal nicht ab?Moritz
-
CSpille schrieb:
Du meinst also der Fehler ist in Logger:debug?
Sehr wahrscheinlich. Wenn das Programm an markierter Stelle abstürzt, dann würde ich erstmal Parameterbereitstellung (get()), und dann Logger::debug näher unter die Lupe nehmen. Wie gesagt, Schritt für Schritt die Funktionen mit dem Debugger durchgehen und schauen, was sich tut.
CSpille schrieb:
Den hab ich zwar auch selbst geschrieben (somit eine potentielle
Fehlerquelle), aber es sollte doch in beiden Fällen, der gleiche Pointer
übergeben werden, oder?Nein. Ein Zeiger wird nicht übergeben. Da get() T* zurückliefert und du dereferenzierst, wird Logger::debug ein T übergeben, in deinem Fall ein QString.
CSpille schrieb:
Deshalb sollte er doch dann auch in beiden
Fällen abstürzen, oder?Nicht unbedingt. Vermutlich handelt es sich hier um undefiniertes Verhalten. Und da kann alles passieren.
CSpille schrieb:
Sind die Codefragmente denn jetzt äquivalent?
Auch hier ein nein.
// Version 1 Speicher reservieren 1 Speicher reservieren 2 put 1 Logger put 2 Logger // Version 2 Speicher reservieren 1 put 1 Logger Speicher reservieren 2 put 2 Logger
Wie gesagt, bei korrektem Code sollte beides problemlos funktionieren. Bei undefiniertem Verhalten, kann es durchaus passieren, dass das eine abstürzt und das andere eben nicht.