簡體   English   中英

shared_ptr內存泄漏沒有刪除操作符

[英]shared_ptr memory leak without delete operator

我已經實現了一個簡單的結構:

struct ListenerNode
{
    ListenerNode() : previous(nullptr), next(nullptr), listener(nullptr), once(false) {}
    std::shared_ptr<ListenerNode> previous;
    std::shared_ptr<ListenerNode> next;
    std::function<void(int)> listener;
    bool once;
};

這將代表場景圖實現中的一個實體。 我觀察到的奇怪行為是當我使用結構時,就像:

int main(int argc, char** argv)
{
    ListenerNode n;
}

它泄漏了內存,但當我使用它時:

int main(int argc, char** argv)
{
    ListenerNode* n = new ListenerNode();
    delete n;
}

它沒有泄漏記憶! 我不明白這里發生了什么。 我一直以為做一類/結構的實例沒有new呼叫立即當變量超出范圍的析構函數。

有人可以向我解釋這里發生了什么嗎? 我也沒有看到任何明顯的參考增量。

根據您的評論,您測試內存泄漏,如下面的代碼片段所示:

int main(int argc, char** argv) 
{
    ListenerNode n;
    _CrtDumpMemoryLeaks();
}

在這種情況下,在調用_CrtDumpMemoryLeaks()n還沒有超出范圍。 你絕對可以在_CrtDumpMemoryLeaks()之后訪問n的內容而沒有任何問題。 在遇到main()的右括號后, n被破壞。

如果你添加一對額外的大括號:

int main(int argc, char** argv) 
{
    { ListenerNode n; }
    _CrtDumpMemoryLeaks();
}

然后,當遇到額外的閉合支撐時, n被破壞。 在調用_CrtDumpMemoryLeaks()n根本不可訪問,因為它已經超出范圍。

如果您在班級中創建列表,則會泄漏內存。 永遠不要使用shared_ptr創建周期(與下一個/上一個一樣),它們不會刪除任何內容。

您不需要使用nullptr初始化shard_ptr。

暫無
暫無

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

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