2016-06-19 15 views
-2

Ich entwickle ein C-Projekt, und es stellt sich heraus, dass ich in einem bestimmten Moment die Funktion calloc() aufruft und einen Speicherblock zuweist, der bereits benutzt wird. Wie ist das möglich ? Ich habe meine Speicherzuweisung überprüft und für jedes Mal, wenn ich malloc/calloc anrufe, rufe ich free (pointer_to_the_allocated_memory) auf. Also ist es kein Speicherleck-Problem, weder ein doppelt freigegebener Zeiger. Ich füge meinen Code nicht ein, da es für eine Kollegenarbeit ist und ich es noch nicht gesendet habe. Jede Art von Hilfe/Beratung ist willkommen. Vielen Dank im Voraus.Calloc() weist vorher zugewiesenen Speicher zu

+0

Probieren Sie etwas wie valgrind mit/debug Nutzung der Speicher zu verfolgen. –

+0

Beachten Sie, dass jedes Programm seinen eigenen virtuellen Speicherplatz hat. – sjsam

+1

Könnten Sie etwas ähnlich dem Original posten? Es gibt eine Menge Leute, die nach proprietärem Code fragen, den sie nicht direkt teilen wollen, aber sie geben normalerweise ein Beispiel. Können Sie die Situation in einem kleineren Maßstab nachbilden? –

Antwort

1

Es ist möglich, dass zwei Zeiger auf dieselbe Stelle zeigen.

p1 = malloc(sizeof(int)); 
/* ... */ 
p2 = p1; 
/* ... */ 
free(p1); 
/* ... */ 
p3 = malloc(sizeof(int)); /* may allocate the block already used by p2 */ 

Beachten Sie, dass es oft nicht so offensichtlich ist. Dies kann über Zeigerarithmetik geschehen (d. H. p2++), oder verschiedene Teile davon können in verschiedenen Funktionen ausgeführt werden.

Eine andere Möglichkeit ist, dass Sie einen Zeiger befreien, ohne es zu merken:

p1 = malloc(sizeof(int)); 
foo(p1); /* this function calls free(p1) */ 
p2 = malloc(sizeof(int)); /* may allocate the block already used by p1 */ 
+1

Sollte das wahrscheinlich möglich sein, ist es nicht wahrscheinlich und es gibt keine Möglichkeit zu wissen, dass das Szenario, das Sie geschrieben haben, passieren würde. Es ist alles sehr umsetzungsspezifisch. – Nava2

+1

Da calloc() "einen Speicherblock zuweist, der bereits verwendet wird", ist es wahrscheinlich. Um einen Speicherblock zuzuordnen, der verwendet wird, sollte der Block entweder freigegeben oder nie zugewiesen werden. – user31264

+0

Danke für die Antwort user31264 – mariano

Verwandte Themen