使用strdup堆积损坏

Heap corruption with strdup

本文关键字:损坏 strdup 使用      更新时间:2023-10-16

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

编辑:

使用这段代码代替strdup效果很好,strdup在msvc上是不是被破坏了?

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

strdup在msvc中被弃用,并且有报道称网络上存在类似的堆损坏,微软表示您应该使用_strdup而不是

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

[EDIT:见下文-真正的原因似乎是加载了vs运行时dll的发布和调试版本,_strdup修复了问题只是巧合]