簡體   English   中英

malloc():內存損壞

[英]malloc(): memory corruption

這是我認為可能導致此錯誤的簡化程序。

char *p = (char*)malloc(8192);
for(int i = 0; i < 9200; ++i){
  p[i] = '1';
}
char *s = (char*)malloc(strlen(p)); 

原始項目相當復雜,所以我簡化了它。 我使用malloc分配了8192個字節。 然后我的程序將超過8192個字符寫入數組。 然后我將使用malloc分配內存。

這個迷你程序沒有崩潰。 但在最初的大項目中,它崩潰了這個錯誤:

malloc():內存損壞:0x0000000007d20bd0 ***

什么可能導致這種差異?

它是未定義的行為,因為您已分配8192字節的內存但您嘗試寫入9200字節。 哪個是出界的。

什么可能導致這種差異?

基本上,內存分配器一次分配內存以供程序使用,它會在其中為您指定一個指針(確保以下空間可以免費使用)。 由於這些頁面通常大於8KiB,因此您的迷你程序沒有問題。 但是如果一個更大的程序分配更大量的內存並進一步寫入已分配空間的末尾,那么你最終會嘗試寫入未分配的內存(或另一個程序使用的內存!),從而破壞內存。

寫入尚未分配的內存是未定義的行為。 那是因為malloc()返回了你可以寫入的一段內存,所以當你寫過該區域的末尾時,你會覆蓋不屬於你的東西。

這可能是malloc本身使用的結構,或者完全不同的東西。

這是運氣問題。 您的操作系統可能會保留超過您請求的8kB的內存。 您之前和之后保留的內容可能會對行為產生影響。

不是說你的程序會在緩沖區溢出時崩潰。 實際上,行為未定義或實現已定義。

暫無
暫無

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

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