2012-12-15 72 views
0

我一直在運行mallocing /釋放內存一個奇怪的問題。我不能顯示整個代碼本身,所以請做一個非常裸露的部分:malloc問題和內存堆

#include <stdio.h> 

int main(void) 
{ 
    void *ptr; 

    ptr = malloc(sizeof(node)); 

    /* making sure what the value is when it was initialized */ 
    printf("head_node: %p\n", ptr); 


    /* i do a lot of things here, such as appending the node, sometimes truncating them */ 


    /* --------------------------------------------------------------------------------*/ 

    /* making sure what the value is still the same: */ 
    printf("head_node: %p\n", ptr); 
    free(ptr); 

    printf("done"); 
} 

其中節點聲明在其他地方。

在我釋放ptr的地方,它的初始值是相同的權利釋放它之前,它不是NULL,我得到在Windows中的錯誤對話框。

現在這裏是奇怪的部分。當我在MinGW下編譯它並在MSYS(MinGW控制檯shell)或其外部運行它時,它不會遇到任何錯誤。當我在MS Visual Express 2012下構建它並在它下面進行調試時,它不會遇到任何錯誤。但是當我運行由MS Visual Visual Studio構建的同一個程序時,我總是得到一個錯誤。

什麼是更奇怪的是,它首先打印出「完成」,這是在錯誤彈出之前程序的最後點。當跟蹤錯誤的來源時不是很有用...

如果在正常的Windows環境中有任何錯誤被捕獲,那爲什麼不在MS Visual?中?

這裏所顯示的異常消息:

File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c 
Line: 1322 
Expression: _CrtIsValidHeapPointer(pUserData) 
+2

這似乎是一個可編譯的最小代碼。 *此*代碼是否顯示問題行爲?如果它確實表明你的環境存在問題,如果不是,那麼你可以開始在「很多事情」的一小部分中重新加入以學習更多東西。這就是說,我懷疑你是雙免費的。請注意'free'不會改變它的參數值。 – dmckee

+0

不幸的是,這個最小的代碼不會重現錯誤。實際的主代碼很長很複雜。它不得不包括其他文件,我不願意這樣做。當你說我可能會雙倍釋放某些東西時,你可能會做些什麼。我會檢查它。 –

回答

1

你的症狀指向你在缺少代碼某處損壞堆。你可能要麼寫一個無效的指針,要麼寫太多的地方到一個有效的指針。只有在程序清理完成時纔會發現堆損壞,並且在此階段不同的編譯器會執行不同的檢查次數。

這是您整個程序中唯一的malloc嗎?如果是這樣,這可能是你的問題的一部分 - 你的'節點'(又名head_node)意味着你正在做一個列表。如果你正在訪問node-> next(或者你正在調用你的鏈接指針的任何東西),而沒有爲此做一個malloc,那麼你的錯誤是。沒有更多的代碼,就不可能說更多。

+0

我認爲這不太可能是節點的「下一個」成員有問題,或者沒有malloc-ed它是下一個節點。我有打印功能打印每個節點的內容。他們都打印得很好而且有序。 –

+0

寫得太多似乎更合理,我只是修正了昨天的情況。 –

+0

就像我說的,沒有看到更多的代碼,一切都只是在黑暗中拍攝。 – iagreen

-1

這可能是內存泄漏。你的指針可能指向一個無效的位置,它被稱爲懸掛指針。因此,檢查你的指針是否指向一個有效的位置(你的指針也可能指向一個無效的垃圾位置)

0

另一個微妙的事情可能是一個問題,特別是因爲問題在不同的構建環境中消失,你是不包括stdlib.h。這可能是因爲你只是把它放在你的「最小」的例子中,但是沒有malloc()的作用域的原型會導致一些非常奇怪的問題。