Merkwürdiger Fehler mit Pointer-Arrays



  • Hi,

    weiß jemand, warum folgender Code nicht richtig funktioniert?

    #include <iostream>
    
    using namespace std;
    
    class TestClass {
    public:
    	TestClass** array;
    
    	TestClass(TestClass** _array) : array(_array) {}
    };
    
    TestClass* test1 = 0;
    TestClass* test2 = 0;
    
    void init_test1() {
    	TestClass* arr[] = { 0 };
    	test1 = new TestClass(arr);
    }
    
    void init_test2() {
    	init_test1();
    	TestClass* arr[] = { 0, test1 };
    	test2 = new TestClass(arr);
    }
    
    int main(int argc, char** argv) {
    	init_test2();
    
    	cout << "test2->array[1]: " << test2->array[1] << endl;
    	cout << "test2->array[1]: " << test2->array[1] << endl;
    	cout << "test1: " << test1 << endl;
    
    	delete test1;
    	delete test2;
    }
    

    Die Ausgabe ist bei mir:

    test2->array[1] : 0x804a008
    test2->array[1] : 0x8049c20
    test1: 0x804a008
    

    Eigentlich sollte der Pointer alle drei mal gleich bleiben, erst recht in den ersten beiden Zeilen.
    Valgrind gibt mir folgenden Fehler:

    ==14731== Invalid read of size 4
    ==14731==    at 0x804880B: main (in /home/pumphaus/Documents/Programmierung/test4/test)
    ==14731==  Address 0xBED1ED20 is just below the stack ptr.  To suppress, use: --workaround-gcc296-bugs=yes
    

    Allerdings benutze ich GCC 4.1 und nicht 2.9.6.

    Woher kann dieser Fehler kommen? Ich bin langsam schon am verzweifeln.
    Danke im Voraus,
    Pumphaus



  • void init_test1() { 
        TestClass* arr[] = { 0 }; 
        test1 = new TestClass(arr); 
    }
    

    du kopierst nie. und arr wird am ende der funktion zerstört. du hast also massig zeiger auf massig speicher der nicht dir gehört. und das gibt: undefiniertes verhalten.



  • Shade Of Mine schrieb:

    du kopierst nie. und arr wird am ende der funktion zerstört. du hast also massig zeiger auf massig speicher der nicht dir gehört. und das gibt: undefiniertes verhalten.

    Ah, ich wusste doch, dass es etwas so simples is... Wenn man Stunden lang auf den Code starrt, ohne Pause, fällt einem sowas einfach nicht ein... -.-
    Danke auf jeden Fall :). Weiß nicht, wie lang es gedauert hätte, bis ich von allein drauf gekommen wär.


Anmelden zum Antworten