2012-01-05 3 views
2

VTV를 MSVC와 함께 사용하고 있으며 데이터를로드 할 때 이상한 동작이 발생합니다. 나는 그것으로 조금만 손을 뻗어서 심지어 다음 코드가 힙 손상을 일으키고, 어떤 아이디어가 일어나고 있는지 또는 무엇이 잘못되었을 지 모르는가?strdup로 인한 힙 손상

> 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++ 

편집 :

잘 작동에서는 StrDup 어떻게 든 MSVC에 깨진 대신에서는 StrDup의이 코드를 사용

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

    char* type=strdup(dataType); 

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

    ... 

이 호출 스택 무엇입니까? 같은

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

여기에 더 많은 컨텍스트가 필요하며 dataType으로 무엇을 전달합니까? 'strdup'와'free' 호출 사이에 어떤 작업을하고 있습니까? – slugonamission

+2

'strdup'과'free' 사이에서 당신은 무엇을하고 있습니까? 아마도 어딘가에서 중복 된 문자열의 끝을 넘어 쓸 것입니다. –

+0

dataType은 내용이 "float"이고 strdup와 free 사이에 연산이없는 char입니다. – Dirk

답변

4

에서는 StrDup이 MSVC에서 사용되지 않으며 웹 주위 유사한 힙 손상의보고가, 마이크로 소프트는 _strdup 사용해야 상태 대신

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

[편집 : 아래를 참조 - 진짜를 원인은 릴리스 및 vs 런타임 DLL의로드 버전을 디버깅하는 것으로 보입니다. 단지 _strdup가 문제를 해결 한 것이 우연의 일치입니다.]

+1

* name *은 더 이상 사용되지 않습니다. 구현시 언어 표준에 지정된 이름 이외의 다른 이름을 사용해서는 안됩니다. 그러므로'_strdup'는 괜찮지 만'strdup'는 그렇지 않습니다. –

+1

당신은 선생님입니다. 제 하루의 영웅이 저에게 무의미한 디버깅 시간을 절약 해줍니다. – Dirk

+1

'strdup' 대신'__strdup'을 사용하면 힙 손상을 해결할 수 있다는 것에 놀랄 것입니다. 더크, 부패가 사라진 것을 확인할 수 있니? Bo Persson이 말했듯이, _name_만이 더 이상 사용되지 않습니다. 함수는 확실히 잘 작동합니다. – nabulke