struct Addresse 2x im RAM



  • Hi,
    habe folgenden Code :

    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    struct data
    {
    		data();
    		data(const data & rhs);
    		~data();
    		unsigned int *i;
    };
    
    data::data()
    {
    	i = new unsigned int;
    	*i = 429496725;
    }
    
    data::data(const data & rhs)
    {
    	i = new unsigned int;
    	*i = *rhs.i;
    }
    
    data::~data()
    {
    	cout << "Destructor of struct \"data\" called...\n";
    	delete i;
    	i = 0;
    }
    
    int main()
    {
    	data * struct1 = new data;
    	data * struct2 = new data (*struct1);
    	cout << "&struct1     " << &struct1<< endl << "struct1      " << struct1  << endl << "struct1->i   " << struct1->i << endl;
    	cout << "------\n";
    	cout << "&struct2     " << &struct2 << endl << "struct2      " << struct2  << endl << "struct2->i   " << struct2->i << endl << endl;
    
    	_getch();
    	return 0;
    }
    

    OUTPUT:

    http://i.gyazo.com/74f7ae05bd92ee0102457e5d0d892842.png

    Wenn man sich die addresse von struct2 (0x0019F910) im RAM anguckt :

    http://i.gyazo.com/88fa6dc61650b5284fc1f5b23c1abf5f.png

    sieht man das der pointer zu meiner struct2 2 mal eingetragen ist.

    Warum ist das nur so ? (Bei struct1 ist es nicht der fall) Vielleicht liegt es an dem copy constructor ?

    Danke schonmal 🙂



  • Bei mir verhält es sich anders. Ich denke mal da ist der Compiler recht frei, und deshalb macht er das so. Der Zugriff ist ganz einfach so nicht definiert.



  • naja, die addressen sind natürlich anders. aber wenn du zu der addresse gehst die du als output bekommst müsste doch das gleiche passieren ?

    Ist denn sonst so weit alles mit meinem code in ordnung ?



  • Das ist vermutlich ein Artefakt der Speicherverwaltung.
    Mit deinem Programm hat das nichts zu tun. Dein "data" ist genau einen int gross, das sind üblicherweise 4 Byte. Was dahinter steht kann und muss dir egal sein, es gehört nicht mehr zu der struct.

    Daher gibt es auch keinen Grund warum hinter der struct auf einem anderen System das selbe stehen sollte. Aus der Sicht des C++ Standard gibt es diese Speicherstellen gar nicht. Und daher macht er natürlich auch keine Aussage darüber was da drinnen stehen sollte.



  • &struct1 = Adresse des Pointers, nicht des Structs.



  • Das ist nicht der RAM sondern der Virtuelle Speicher deines Programms.



  • @hustbaer
    Danke für die hilfreiche Antwort.

    @oenone
    Stimmt, an der stelle steht aber die Adresse meiner struct.

    @ebx
    Aber das ist doch im Endeffekt der RAM ? (also ein kleiner Teil davon)


Anmelden zum Antworten