簡體   English   中英

使用STL容器的C ++內存泄漏

[英]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容器所做的所有事情就是調用其持有的對象的析構函數。 在類本身中處理內存仍然是您的責任。

更具體地說,析構函數必須釋放在類中用newmalloc聲明的任何內容。 STL容器不知道如何刪除它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM