C++ 使用多线程调试DLL编译时Visual Studio中的访问冲突

C++ 使用多线程调试DLL编译时Visual Studio中的访问冲突,c++,visual-studio-2013,segmentation-fault,gdal,ogr,C++,Visual Studio 2013,Segmentation Fault,Gdal,Ogr,我正在使用GDAL/OGR库构建一个应用程序,并且遇到了一个非常奇怪的问题,即在运行使用多线程调试DLL(/MDd)运行库选项编译的程序时遇到访问冲突错误。以下示例是演示该问题的最简单示例: #include <ogr_geometry.h> int main(int argc, char* argv[]) { OGRPoint *point = new OGRPoint; delete point; // segmentation fault return

我正在使用GDAL/OGR库构建一个应用程序,并且遇到了一个非常奇怪的问题,即在运行使用多线程调试DLL
/MDd
)运行库选项编译的程序时遇到访问冲突错误。以下示例是演示该问题的最简单示例:

#include <ogr_geometry.h>

int main(int argc, char* argv[])
{
    OGRPoint *point = new OGRPoint;
    delete point; // segmentation fault
    return 0;
}

关于是什么导致了这个问题,你有什么想法吗?

你的结论是,CRT发行版一切正常,这很可能是错误的。它只是由于一个bug而表现出不同的行为。可能是一个未初始化的指针,在发布版本中初始化为零,但在调试版本中获取特定模式(0xCDCDCD)。我还考虑了@IInspectable,因此我检查了源代码,因为它是一个开源库。尽管
OGRPoint
类有一个成员指针,但它在构造函数中被正确初始化为
NULL
,并在析构函数中删除之前进行检查。此外,如果问题是您提到的,则在堆栈上创建对象时也会出现segfault。但是,在这种情况下它可以正常工作。不熟悉
GDAL/OGR库
,但它是否使用(相同的)CRT本身,在调试和发布配置中是否有不同的LIB链接?@dxiv:GDAL/OGR库的构建脚本不会为调试/发布配置生成不同的LIB。以前我只使用库的
GDAL
部分,在那里我没有遇到堆损坏问题。不过,我现在根据你的评论开始搜索,看起来你有一个很好的观点。尽管不幸的是,他们似乎不打算处理这个问题:
ntdll.dll!_RtlReportCriticalFailure@8() Unknown
ntdll.dll!_RtlpHeapHandleError@4()  Unknown
ntdll.dll!_RtlpLogHeapFailure@24()  Unknown
ntdll.dll!RtlFreeHeap() Unknown
AcLayers.dll!6d7158bf() Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for AcLayers.dll]  
gdal201.dll!0f87bdbd()  Unknown
TestProject.exe!main(int argc, char * * argv) Line 7    C++
[External Code]