Seite 1 von 1

Uverständliche Ausgabe des Compilers

Verfasst: 6. Oktober 2013 18:30
von Pauer
Hallo zusammen,

ich bin gerade dabei, qt zu lernen. Dabei benutze ich ein Buch, welches den Mangel hat, dass es bei der Wiederholung von c++ teilweise keine Lösungen angibt.
Da liegt auch das Problem. Ich habe eine Aufgabe, bei welcher ich die Ausgabe des Programms nachvollziehen bzw. erklären soll. Die Ausgabe ist mir größtenteils klar, nur die letzten 2 Zeilen bereiten mir Probleme.

Zunächst das Programm:

Code: Alles auswählen

#include <QTextStream>

int main() {
QTextStream cout(stdout);
    const char tab = '\t';
    int n = 13;
    int* ip = new int(n + 3);
    double d = 3.14;
    double* dp = new double(d + 2.3);
    char c = 'K';
    char* cp = new char(c + 5);
    cout << *ip << tab << *dp << tab << *cp << endl;
    int* ip2 = ip;
    cout << ip << tab << ip2 << endl;
    *ip2 += 6;
    cout << *ip << endl;
    delete ip;
    cout << *ip2 << endl;
    cout << ip << tab << ip2 << endl;
    return 0;
Dabei ist mir Zeile nach dem delete ip nicht klar. Bei jeglichen Versuchen kommt da bei mir 36 raus und ich komm nicht darauf, warum das so ist. Ich habe versucht alle möglichen Variablen zu ändern, um ein anderes Ergebnis zu bekommen, ohne Erfolg.
Hat vielleicht jemand einen Tip?
Für die Hoilfe schon mal vielen Dank.

Gruß
Patrick

Re: Uverständliche Ausgabe des Compilers

Verfasst: 6. Oktober 2013 23:06
von Christian81
Du greifst auf uninitialisierten Speicher zu und wunderst dich dass da Müll drin steht? C++ Grundlagen denn nur weil da QTextStream anstatt std::cout benutzt wird hat das nix mit Qt zu tun :)
Was soll der Code überhaupt? Nur ein Testcase oder was zum Üben?

Re: Uverständliche Ausgabe des Compilers

Verfasst: 7. Oktober 2013 08:37
von Hulk2442

Code: Alles auswählen

int* ip2 = ip;
cout << ip << tab << ip2 << endl;
„ip2“ als auch „ip“ zeigen auf den gleich Speicher

Code: Alles auswählen

*ip2 += 6;
cout << *ip << endl;
„ip2“ als auch „ip“ werden um den Wert 6 vergrössert

Code: Alles auswählen

delete ip;
cout << *ip2 << endl;
cout << ip << tab << ip2 << endl;
Da beide Pointer auf den gleichen Speicher zugreifen wird beim löschen eines Pointers auch das Ergebnis des Anderen gelöst.
Somit zeigt ip2 (da er noch existiert) auf einen Speicher welcher nicht mehr existiert = PROBLEM

btw.:
Was meinst du mit 36?
Das ist die Ausgabe deines Programms (tabs werden hier online falsch dargestellt)
16 5.44 P
0x22f4850 0x22f4850
22
0
0x22f4850 0x22f4850