Повреждение кучи с помощью strdup - PullRequest
2 голосов
/ 05 января 2012

Я использую VTK вместе с MSVC и получаю странное поведение при попытке загрузить данные. Я немного возился с этим, и даже следующий код генерирует кучу искажений, есть идеи, что происходит или что могло пойти не так?

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

  char* type=strdup(dataType);

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

  ...

Это стек вызовов:

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

EDIT:

Использование этого кода вместо strdup работает хорошо, strdup как-то не работает на msvc?

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

1 Ответ

4 голосов
/ 05 января 2012

strdup как таковой устарел в msvc, и есть сообщения о подобном повреждении кучи по всему Интернету, Microsoft заявляет, что вы должны использовать _strdup вместо

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

[РЕДАКТИРОВАТЬ: см. Ниже -реальная причина, по-видимому, заключается в том, что загружаемая и отладочная версии загружаемой DLL-библиотеки времени выполнения, просто совпадение, что _strdup решает проблему]

...