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.


Anmelden zum Antworten