[英]C++ Memory Leak Using STL Containers
以下代碼給了我內存泄漏(使用Visual Studio):
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <vector>
#include <memory>
struct Listener {};
struct Subject
{
std::vector<Listener*> listeners;
};
int main(void)
{
Subject subject;
_CrtDumpMemoryLeaks();
return 1;
}
我認為這是因為實例化Subject
類時,STL矢量容器正在堆上使用內存。 程序退出時,如何確保矢量容器被銷毀? (我曾嘗試刪除Subject
析構函數中的容器,但這似乎不起作用)。
程序退出時, vector
被銷毀,您無需確保它。 您確實需要確保在銷毀之后調用_CrtDumpMemoryLeaks
,如果您不希望它報告分配的內存為“泄漏”:
int main()
{
{ Subject subject; }
_CrtDumpMemoryLeaks();
return 1;
}
std::vector<Listener*> listeners;
不會釋放偵聽器的成員。 您必須使用以下方法刪除向量中的每個偵聽器:
for (int i = 0; i < listeners.size(); i++) delete listeners[i]
就個人而言,我通過使用智能指針來避免此類問題:
std::vector<std::unique_ptr<Listener>> listeners
_CrtDumpMemoryLeaks通過計數新聞並確保它們都匹配來檢測泄漏。 因為主題永遠不會超出范圍,所以我認為它被認為是出色的參考。 嘗試int main(void) {{Subject subject;}_CrtDumpMemoryLeaks(); return 1}
int main(void) {{Subject subject;}_CrtDumpMemoryLeaks(); return 1}
確保Listener
析構函數銷毀它所需的所有內容。 STL容器所做的所有事情就是調用其持有的對象的析構函數。 在類本身中處理內存仍然是您的責任。
更具體地說,析構函數必須釋放在類中用new
或malloc
聲明的任何內容。 STL容器不知道如何刪除它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.