dll中的c ++静态局部变量初始化导致_CrtIsValidHeapPointer异常

时间:2015-04-15 14:14:12

标签: c++ exception dll static

我有一个例外是在将静态局部变量初始化为类实例时使用的dll。 从类构造函数返回时发生异常。

我发布的例外是:

  

ConsoleApplication1.exe:0xC0000005:访问冲突读取位置0x00000000BA3529A2。

在调试中我得到一个调试断言:

  

Debug Assertion失败!

     

程序:E:\ Sandbox \ ConsoleApplication1 \ x64 \ Debug \ ConsoleApplication1.exe
  文件:f:\ dd \ vctools \ crt \ crtw32 \ misc \ dbgheap.c
  行:1516

     

表达式:_CrtIsValidHeapPointer(pUserData)

这是失败的功能(CImg库的一部分非常棒!):

static const CImg<Tuchar>& jet_LUT256() {
  static CImg<Tuchar> colormap; // <--- static local variable decleration
// exception here. after returnning from the CImg constructor :-( 
  cimg::mutex(8);
  if (!colormap) {
    colormap.assign(1,4,1,3,0);
    colormap[2] = colormap[3] = colormap[5] = colormap[6] = colormap[8] = colormap[9] = 255;
    colormap.resize(1,256,1,3,3);
  }
  cimg::mutex(8,0);
  return colormap;
}

当项目作为exe运行时,一切正常。 当我把它变成dll时问题就开始了,并在另一个exe中使用它。

1 个答案:

答案 0 :(得分:0)

解决。

发现问题是我使用了/ NOENTRY属性(大NONO!)

(因为当我将它从exe转换为dll时,我的链接错误与未解析的函数mainCRTStartup

从属性中删除了/ NOENTRY-> Linker-&gt; Advanced并且错误消失了。