我知道在你的硬盤上,如果刪除一個文件,數據不會(立即)消失。數據仍然存在,直到它被覆蓋。我想知道在記憶中是否存在類似的概念。假設我爲一個字符串分配了256個字節,那麼這個字符串仍然會在I free()
之後的某個地方浮動,直到它被覆蓋?free()後的內存會怎樣?
回答
一般來說,它呆在身邊,除非你明確地覆蓋該字符串free
之前荷蘭國際集團它(像人們有時會做密碼)。某些庫實現會自動覆蓋釋放內存以捕獲對其的訪問,但這不是在發佈模式下完成的。
這就是我雖然,我想我應該使用ZeroMemory之前,我'免費()'它防止它被釋放後被讀取。謝謝。 – Lienau 2011-02-26 04:19:27
@Lienau如果你想要一些矯枉過正(總是好的:)),你可以使用國防部或古特曼,但那些適用於您的硬盤驅動器... – 2011-02-26 04:28:18
你的比喻是正確的。內存中的數據不會消失或類似的東西;儘管試圖從釋放的內存中讀取是未定義的行爲,但值free()
之後的確可能仍然存在。
答案很大程度上取決於實施。在一個好的實現中,很可能至少內存的開始(或結束?)將被記錄信息覆蓋,以便跟蹤隨後可以重用的空閒塊的內存。但細節會有所不同。如果您的程序具有任何級別的併發/線程(即使在庫實現中您可能看不到),那麼這樣的內存可能會異步破壞,甚至可能以這種方式甚至讀取它是危險的。當然,free
的實現可能會完全取消映射程序的虛擬地址空間的映射範圍,在這種情況下,嘗試對其執行任何操作都會導致程序崩潰。
從應用程序作者的角度來看,你應該簡單地把free
根據規範,從不訪問釋放的內存。但從系統實現者或集成者的角度來看,瞭解(或設計)實現可能是有用的,在這種情況下,您的問題就變得有趣了。
我真的沒有讀我的解除分配的內存,因爲我認爲任何意圖關於不確定性和不穩定性也是如此。這個問題只是出於我的好奇心。 – Lienau 2011-02-26 04:29:51
如果你想驗證你的執行行爲,下面的簡單程序會爲你做的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* The number of memory bytes to test */
#define MEM_TEST_SIZE 256
void outputMem(unsigned char *mem, int length)
{
int i;
for (i = 0; i < length; i++) {
printf("[%02d]", mem[i]);
}
}
int bytesChanged(unsigned char *mem, int length)
{
int i;
int count = 0;
for (i = 0; i < MEM_TEST_SIZE; i++) {
if (mem[i] != i % 256)
count++;
}
return count;
}
main(void)
{
int i;
unsigned char *mem = (unsigned char *)malloc(MEM_TEST_SIZE);
/* Fill memory with bytes */
for (i = 0; i < MEM_TEST_SIZE; i++) {
mem[i] = i % 256;
}
printf("After malloc and copy to new mem location\n");
printf("mem = %ld\n", mem);
printf("Contents of mem: ");
outputMem(mem, MEM_TEST_SIZE);
free(mem);
printf("\n\nAfter free()\n");
printf("mem = %ld\n", mem);
printf("Bytes changed in memory = %d\n", bytesChanged(mem, MEM_TEST_SIZE));
printf("Contents of mem: ");
outputMem(mem, MEM_TEST_SIZE);
}
這很有意思,謝謝! – Lienau 2011-02-26 08:23:53
- 1. exec後的內存使用情況會怎樣?()
- 2. symfony2 free -m內存不足
- 3. 如果我忘記釋放C++中的內存會怎麼樣
- 4. XNA怎樣的ContentManager內存處理
- 5. 這會泄漏內存嗎?我怎樣才能防止它?
- 6. 內存分配違規後free()的奇怪行爲
- 7. malloc/free。可以從釋放的內存
- 8. 鏈接列表中的C free()內存
- 9. free()的內存初始化爲0
- 10. 使用free(),稍後會發生什麼?
- 11. 使用free()時內存使用量不會減少()
- 12. fclose()然後free()?
- 13. C - free()對內存有什麼作用?
- 14. 在Linux中確定'Free'內存
- 15. linux new/delete,malloc/free大內存塊
- 16. 內存峯值,並使用malloc和free
- 17. 如果EXE和DLL有不同的內存對齊會怎麼樣?
- 18. Linux服務器上的「free」緩存內存?
- 19. 標準Wurfl緩存怎麼樣 - 查看內存佔用情況
- 20. 在ChannelFutureListener內拋出的異常會怎樣?
- 21. Windows進程的內存映射是怎樣的?
- 22. 代理緩存 - 怎麼樣?
- 23. 我怎樣才能使用valgrind的內存配置文件
- 24. 我怎樣才能得到更小的內存使用fmod_event
- 25. 使用malloc分配沒有分配的內存,怎麼樣?
- 26. 怎樣才能實現我自己的內存查看器QT
- 27. gitattributes中的`* text = auto eol = lf`會怎樣?
- 28. main()的返回值會怎樣?
- 29. 類體返回的值會怎樣?
- 30. 怎樣的preg_replace空格前後的詞
這是什麼都與Windows呢?你是否特意問窗口? – UpAndAdam 2013-09-04 21:12:39