Hier habe ich tmp nicht freigegeben, aber ptr wird explizit freigegeben. Wird tmp auch freigegeben werden, da sich ptr und tmp auf den gleichen Ort beziehen?Wird dies zu einem Speicherverlust in C++ führen?
Wenn nicht dann was passiert mit dem Zeiger tmp? Führt es zu einem Speicherleck?
Antwort
Nein, dies führt nicht zu einem Speicherverlust. Speicherlecks sind Puffer (Speicherblöcke), die zugewiesen, aber nicht zurückgegeben wurden (wenn sie nicht mehr verwendet werden). In Ihrer alloc()
Funktion ist tmp
kein Puffer ... es ist eine Variable, die nach dem Aufruf an new
die Adresse eines Puffers enthält. Ihre Funktion gibt diese Adresse zurück, die unter main()
in der Variablen ptr
gespeichert wird. Wenn Sie später delete ptr
aufrufen, geben Sie den Puffer frei, der ptr
Punkte anzeigt, somit wurde der Puffer freigegeben und es gibt kein Leck.
Was passiert, wenn ich mehrere RAW-Zeiger auf den gleichen Speicherort habe und einen dieser Zeiger frei habe? Ist die Erinnerung dann frei? – kishore
@kishore Ja, Sie müssen Ihren Puffer genau einmal freigeben, und es spielt keine Rolle, wie viele Stellen (Zeiger) Sie eine Kopie der Adresse des Puffers haben. – mah
Ihr Programm keinen Speicher verursacht Leck sofern nicht abgefangene Ausnahmen geworfen werden.
Sie können es besser machen und es zu 100% bombensicher wie diese machen:
#include <memory>
std::unique_ptr<int> alloc()
{
std::unique_ptr<int> tmp { new int };
//... anything else you might want to do that might throw exceptions
return tmp;
}
int main()
{
std::unique_ptr<int> ptr = alloc();
// other stuff that may or may not throw exceptions
// even this will fail to cause a memory leak.
alloc();
alloc();
alloc();
auto another = alloc();
// note that delete is unnecessary because of the wonderful magic of RAII
return 0;
}
früh in diese Gewohnheit.
- 1. Wird dies zu einem Kardanverschluss führen?
- 2. Kann Application.terminate zu Speicherverlust führen?
- 3. Wie kann dies zu einem Deadlock führen?
- 4. Führen rekursive Sequenzen Speicherverlust aus?
- 5. Warum verursacht dies einen Speicherverlust?
- 6. C# Speicherverlust in Schleife
- 7. Erkennung von Speicherverlust in C
- 8. Wie asynchrone Tasks und Cursor zu Speicherverlust führen?
- 9. Wird dies dazu führen, dass schlechte Dinge passieren?
- 10. C/C++ Speicherverlust (mit PCRE)
- 11. c Speicherverlust Problem
- 12. Speicherverlust mit Valgrind in c
- 13. Warum glauben Instrumente, dass dies ein Speicherverlust ist?
- 14. Kann Speicherverlust in C-Anwendung nicht finden
- 15. Wiederverwenden einer NSString-Variable - führt es zu einem Speicherverlust?
- 16. Haskell: Warum würde dies zu einer leeren Liste führen?
- 17. Bedeutet das Speichern des Aktivitätskontexts in einem DialogFragment einen Speicherverlust?
- 18. Speicherverlust in iPhone Obj C-Code
- 19. Lua C API Speicherverlust? (Valgrind)
- 20. Sollte dies nicht zu einem Überlauf führen? Es tut es nicht!
- 21. Warum erlauben Sie `propagate_on_container_swap == false` in Allocators, wenn dies zu undefiniertem Verhalten führen könnte?
- 22. wie Speicherverlust zu beheben?
- 23. Würde in Perl ein Verweis auf Catalyst $ c in einem Attribut einen Speicherverlust verursachen?
- 24. Wird dies als SFINAE betrachtet?
- 25. Verursacht der folgende Code Speicherverlust in C++
- 26. Möglicher Speicherverlust auf GeoIP_new API in C
- 27. Ist dies ein Ziel-C-Speicherleck?
- 28. XML Hilfe zu C#, Bitte wandeln Sie dies in C#
- 29. Mögliche Speicherverlust unter Verwendung von C++ String
- 30. Möglicher Speicherverlust, weil StringBuffer nicht verwendet wird?
Es verursacht kein Leck. Der Zeiger 'tmp' selbst ist eine Stapelvariable, also verwendet er keinen Speicher, wenn 'alloc()' zurückkommt. –
Wie ist tmp eine Stapelvariable, wenn sie einen neuen Operator verwendet? – kishore
@kishore: 'ptr' hält nur eine Adresse. Diese Adresse ist auf dem Stapel gespeichert. Was es an _ (die Ressource) zeigt, ist woanders, und das müssen Sie freigeben (die Ressource, nicht der Zeiger). 'delete prt;' tut eigentlich nichts zu 'ptr'. Nur zu dem, worauf es hinweist. – Mat