2016-06-23 10 views
-1

Ich bin mit ::operator new(sizeof(T) * count) Platz zuweisen.Ich erhalte sehr unterschiedliche Adressen bei der Zuweisung von Speicherplatz

Der erste Anruf gibt eine Adresse 0x742f30 zurück und der zweite gibt 0x7f2ef0000d60 zurück. Ich bin jetzt verwirrt über den großen Unterschied.

Meine Frage: Ist das normal, dass die zurückgegebenen Adressen so unterschiedlich sein können?

Update:

SLES 11 SP3 VM on XenServer 
gcc 4.9.3 
10 GB RAM 

Update:

Weil manche Leute ein falsches Ausgabeformat vermutet. Ich zeige die zurückgegebene Adresse durch den new Befehl mit demselben printf Format an. Ich kopiere die Zeigerwerte auf diese Frage durch Kopieren und Einfügen und überprüfe sie zweimal. Sie stimmen mit der Ausgabe meines Memory Allocators überein.

+0

Ja, da der Speicher tatsächlich Standorte als nicht zugewiesen markiert, und es kann kleine Block verstreut über den gesamten Speicher nicht ansteckend sein. – MoustafaS

+0

Können Sie etwas Code posten? Idealerweise etwas, das wir zusammenstellen und mit uns selbst spielen können. –

+0

Das ist ** sehr seltsam ** ... Der Unterschied ist ca.: ** ~ 140TB ** - Sind Sie sicher, dass Sie die Nummern richtig gebucht haben? – WhiZTiM

Antwort

0

Angenommen, es gibt keine Beschränkungen in Bezug auf den Speicherort des erforderlichen Speicherblocks, solange das Ergebnis ein gültiger Speicherzeiger (d. H. Nicht null) ist, sollte es als gut angesehen werden. Aber ich als Programmierer wäre überrascht, wenn die Antwort von der Speicherzuweisungsfunktion anders formatiert wäre (in diesem Fall mit einer anderen Anzahl von Ziffern).

Wenn man bedenkt, dass es sich um eine eigene Bibliothek handelt, würde ich zumindest sicherstellen, dass sie immer die Adresse des zugewiesenen Speichers im exakt gleichen Format ausgibt.

1

Eine mögliche Ursache ist, dass das erste Objekt im ersten Datensegment des Prozesses zugeordnet wurde, aber bis zu der Zeit, als Sie das zweite Objekt zugewiesen haben, ist dieses gefüllt. Herkömmliche Speicherzuweiser verwenden sbrk(), um das Datensegment zu erweitern, aber einige moderne Speicherzuordner verwenden mmap() unter /dev/zero, um neue Speichersegmente zu erstellen. Dies könnte seinen virtuellen Speicher in einem sehr entfernten Teil des Adressraums zuweisen.

+0

Der seltsame Zeiger wird in der dritten Zuweisung in meinem eigenen STL Memory Allocator zurückgegeben. Ich denke nicht wirklich daran, weil das Objekt voll ist. Ich möchte den Code veröffentlichen, aber es ist zu komplex, um hier veröffentlicht zu werden. Es gibt Dutzende von Strukturen, die vom Memory Allocator zugewiesen werden. Wie auch immer, schon haben 3 Leute dafür gestimmt, diese Frage zu schließen, also denke ich, dass sie sowieso geschlossen sein wird. Wir haben jetzt in Mitteleuropa 1:30 Uhr und ich muss ins Bett gehen.Das Programm läuft nun stundenlang mit vielen Threads und es stürzt nicht ab -> die seltsamen Zeiger zeigen wirklich auf einen gültigen Speicher. –

0

Meine Antwort ist, dass es eine seltsame Virtualisierung des Speichers durch Linux sein muss. Die Ausgabe der Adressen hat immer das gleiche Format. Ich denke, die Antwort von Barmar kommt dem wahren Grund sehr nahe. Vielleicht frage ich die SuSe IT und sie haben eine Antwort darauf.