我正在将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工作得很好,是不是在msvc上以某种方式打破?
char *type=(char*)malloc(100);
strcpy(type,dataType);
答案 0 :(得分:4)
strdup因此在msvc中被弃用,并且有关于Web的类似堆损坏的报告,微软声明你应该使用_strdup而不是
http://msdn.microsoft.com/en-us/library/ms235454
[编辑:见下文 - 真正的原因似乎是vs运行时dll的发布和调试版本正在加载,这只是_strdup解决问题的巧合]