[英]What happens to globally allocated memory?
我有一個這樣的程序:
int *number0 = new int;
int main()
{
int *number1 = new int;
}
我想,兩個內存分配都會引入內存泄漏,雖然valgrind只會在main函數中抱怨number1。 這是為什么?
Valgrind不是檢測是否存在所有可能的內存泄漏的完美工具,而是一種可以檢測到一些內存泄漏的有用工具。 這意味着valgrind輸出不能用於確定特定代碼段是否包含任何泄漏。
你的new
都沒有相應的delete
,從這個意義上說,他們都被泄露了。
很可能valgrind認為number0
內存不會被泄露,因為它指向的內存在程序執行結束時是可以訪問的。 與此相反, number1
超出了范圍,因此它指向的內存在程序執行結束時無法訪問,因此valgrind認為它被泄露。
運行這個
int *x = new int;
int main()
{
return 0;
}
使用valgrind(3.8.1)與( -v --track-origins=yes --leak-check=full --show-reachable=yes
)使用valgrind(3.8.1)編譯(即沒有主要的泄漏,用g ++ 4.8.1編譯)我明白了:
==34301==
==34301== HEAP SUMMARY:
==34301== in use at exit: 4 bytes in 1 blocks
==34301== total heap usage: 1 allocs, 0 frees, 4 bytes allocated
==34301==
==34301== Searching for pointers to 1 not-freed blocks
==34301== Checked 189,064 bytes
==34301==
==34301== 4 bytes in 1 blocks are still reachable in loss record 1 of 1
==34301== at 0x4C2A879: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==34301==
==34301== LEAK SUMMARY:
==34301== definitely lost: 0 bytes in 0 blocks
==34301== indirectly lost: 0 bytes in 0 blocks
==34301== possibly lost: 0 bytes in 0 blocks
==34301== still reachable: 4 bytes in 1 blocks
==34301== suppressed: 0 bytes in 0 blocks
這意味着您還應該注意in use at exit
類別in use at exit
。
看起來valgrind似乎沒有錯過它,只是把它放在另一個類別中,可能是因為只有當你無法通過任何方式追蹤該地址並釋放它時它們才會假設丟失的東西,但這個變量永遠不會丟失 。
但是這樣:
int *x = new int;
int main()
{
x = new int;
return 0;
}
被檢測為泄漏,你真的失去跟蹤你分配的內存中。
編輯:如記憶檢查手冊中所述 :
“仍然可以到達”。 這包括上面的情況1和2(對於BBB塊)。 找到該塊的起始指針或起始指針鏈。 由於仍然指向該塊,程序員至少在原則上可以在程序退出之前釋放它。 “仍然可以訪問”的塊是非常常見的,可以說不是問題。 因此,默認情況下,Memcheck不會單獨報告此類塊。
因此,如前所述他們確實發現了它,他們只是認為它不那么令人興奮
我使用valgrind 3.8.1 / g ++ 4.8.1看到兩個泄漏:
$ g++ -o foo -g foo.cc
$ valgrind ./foo
...
==7789== HEAP SUMMARY:
==7789== in use at exit: 8 bytes in 2 blocks
==7789== total heap usage: 2 allocs, 0 frees, 8 bytes allocated
==7789==
==7789== LEAK SUMMARY:
==7789== definitely lost: 4 bytes in 1 blocks
==7789== indirectly lost: 0 bytes in 0 blocks
==7789== possibly lost: 0 bytes in 0 blocks
==7789== still reachable: 4 bytes in 1 blocks
==7789== suppressed: 0 bytes in 0 blocks
在我的測試中,“絕對丟失”的字節是main
。
這個
int *number0 = new int;
不是內存泄漏,因為它在執行結束時被回收。
這種配置是[潛在的]內存泄漏,因為
int main()
{
int *number1 = new int;
}
代碼的其他部分可以調用
main () ;
它可以被反復調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.