2012-01-05 145 views
2

我正在使用VTK與MSVC並嘗試加載數據時得到一個奇怪的行爲。我修改了一下它,甚至下面的代碼會產生一個堆損壞,任何想法正在發生什麼或可能出錯?使用strdup堆損壞

vtkAbstractArray *vtkDataReader::ReadArray(const char *dataType, int numTuples, int numComp) 
{ 

    char* type=strdup(dataType); 

    free(type); // <--- here the heap corrution appears 

    ... 

這是調用堆棧:使用此代碼代替的strdup工作得很好,是的strdup莫名其妙上破MSVC

> msvcr90d.dll!_CrtIsValidHeapPointer(const void * pUserData=0x00691da0) Zeile 2103 C++ 
    msvcr90d.dll!_free_dbg_nolock(void * pUserData=0x00691da0, int nBlockUse=1) Zeile 1317 + 0x9 Bytes C++ 
    msvcr90d.dll!_free_dbg(void * pUserData=0x00691da0, int nBlockUse=1) Zeile 1258 + 0xd Bytes C++ 
    msvcr90d.dll!free(void * pUserData=0x00691da0) Zeile 49 + 0xb Bytes C++ 
    Simulator.exe!vtkDataReader::ReadArray(const char * dataType=0x0370b734, int numTuples=24576, int numComp=3) Zeile 1401 + 0xc Bytes C++ 
    Simulator.exe!vtkDataReader::ReadPoints(vtkPointSet * ps=0x081702d0, int numPts=24576) Zeile 1936 + 0x15 Bytes C++ 

編輯?

char *type=(char*)malloc(100); 
strcpy(type,dataType); 
+1

可能需要一些更多的上下文這裏,你這是在傳遞作爲的dataType?你在「strdup」和「free」調用之間做什麼操作? – slugonamission 2012-01-05 10:02:54

+2

你在'strdup'和'free'之間做什麼?你可能寫在超出重複字符串末尾的地方。 – 2012-01-05 10:04:04

+0

dataType是內容爲「float」的char,在strdup和free之間沒有操作。 – Dirk 2012-01-05 10:05:14

回答

4

的strdup這樣的MSVC已被棄用,也有各地的網絡類似堆損壞的報告,微軟聲稱你應該使用_strdup代替

http://msdn.microsoft.com/en-us/library/ms235454

[編輯:見下面 - 真實的原因似乎是在VS運行時DLL加載的發佈和調試版本,它只是_strdup解決了這個問題一個巧合]

+1

這只是*名稱*已被棄用。實現不應該使用語言標準中指定的名稱以外的名稱。因此'_strdup'確定,但'strdup'不是。 – 2012-01-05 10:57:56

+1

你,先生,是我一天的節約我失去了知覺調試:) – Dirk 2012-01-05 11:00:58

+1

小時的英雄我會_really_感到驚訝,如果使用'__strdup',而不是'strdup'將修復堆損壞。德克,你能證實腐敗消失了嗎?正如Bo Persson所說,只有_name_被棄用,該功能肯定能正常工作。 – nabulke 2012-01-05 11:07:31