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
Antwort
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 */
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
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
Danke für die Antwort user31264 – mariano
- 1. Weist CudaMallocManaged Speicher auf dem Gerät zu?
- 2. befreiend zugewiesenen Speicher
- 3. Möglichkeit, den auf freien Speicher zugewiesenen Speicher zu erhöhen
- 4. Dynamische Speicherzuweisung innerhalb dynamisch zugewiesenen Speicher auf C++
- 5. lieber malloc über calloc
- 6. wie finden zugewiesenen Speicher in Linux
- 7. C++: Klasseninstanz im zugewiesenen Speicher ablegen
- 8. behandelt zugewiesenen Speicher als einen anderen Typ
- 9. malloc gibt Zeiger auf zugewiesenen Speicher zurück
- 10. Machen aufeinanderfolgende "neue" Operatoren zusammenhängenden zugewiesenen Speicher?
- 11. Geben Sie einen zugewiesenen Zeiger frei
- 12. Dynamischer Speicher (Calloc) und Zeiger auf Zeiger [C]
- 13. Mehrdimensionale Arrays, die über Calloc zugewiesen werden
- 14. ist es notwendig, Guss zu geben malloc und calloc
- 15. Python 3- weist Noten zu
- 16. Ist es in Ordnung, verschiedene Datentypen in demselben zugewiesenen Speicher in C zu speichern?
- 17. C11 stdatomic und calloc
- 18. Wie kann man den von cdev_alloc zugewiesenen Speicher freigeben?
- 19. Warum zeigt EKG meinen zugewiesenen Speicher nicht an?
- 20. In welchem genauen Moment ist eine lokale Variable zugewiesenen Speicher?
- 21. Rufen Sie einen Konstruktor auf einem bereits zugewiesenen Speicher
- 22. Freie zugewiesenen Speicher, bevor Sie eine Funktion zurückgeben
- 23. Calloc schlägt fehl und gibt NULL
- 24. Warum weist Haskell beim Arbeiten mit Zeichenketten große Mengen an Speicher zu?
- 25. Python weist mehreren Variablen denselben Listenwert zu?
- 26. Welchen SQL-Datentyp weist Oracle "count (*)" zu?
- 27. Wie weist Storm den Arbeitern Aufgaben zu?
- 28. Weist min-width einem bootstrap panel zu
- 29. Wie weist man struct Werte zu?
- 30. SystemVerilog weist generierten Blöcken Werte zu
Probieren Sie etwas wie valgrind mit/debug Nutzung der Speicher zu verfolgen. –
Beachten Sie, dass jedes Programm seinen eigenen virtuellen Speicherplatz hat. – sjsam
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? –