[英]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.