标签:
R6010 -abort() has been called
环境:
Windows7 旗舰版 64Bit
Visual studio 2012 编译32Bit运行程序
Eigen 矩阵库
GLEW opengl扩展库
问题描述:
莫名其妙的遇到了R6010错误,通过屏蔽代码最终将问题定义到这个示例程序范围内。当定义了函数opengl_fun()后,应用程序就会链接GLEW.dll库。运行程序,就会在代码:
CTemp *ptTemp = new CTemp();
发生崩溃,如下图所示。
由于是使用了stl的多线程,所以具体的原因很难定位。表面直接原因就是在类CTemp声明中直接使用了 Eigen::Matrix4d mat4d 对象,但是这个类是通过模板实现的,所以让问题的原因更加诡异。
问题结果:
此外在以下两种情况下并不发生崩溃:
(1)如果蔽掉opengl_fun()函数,让应用程序不在链接GLEW.dll,那么不在发生崩溃;
(2)如果不屏蔽opengl_fun()函数,将stl的多线程更改为Windows的原生多线程,也不会出现崩溃。
所以最终问题的原因可能出现在GLEW.dll库上面,也可能出现在模板或者stl的多线程上,但是却无法解决。后来我只能通过放弃stl的多线程,改用Windows的远程多线程。大家有没有遇到相同类似的问题,可以讨论讨论!
重现代码:
//include:opengl头文件,Eigen模板头文件 //lib : opengl的lib文件 //link : 链接glew32.lib //dll : 运行时需要glew32.dll #include <stdlib.h> #include <Eigen/Eigen> #include <GL/glew.h> #include <thread> void opengl_fun() //只有当定义了该函数,才会真正链接上glew.dll库 { GLuint vVbo = 0; glGenBuffers( 1, &vVbo ); } class CTemp { public: CTemp() {} ~CTemp() {} private: Eigen::Matrix4d mat4d; }; void render_thread_fun( void *pt ) { CTemp *ptTemp = new CTemp(); //当链接glew32.dll库时,就会出现崩溃错误 } int main(int argc, char* argv[]) { void *ptT = NULL; std::thread render_thread = std::thread( render_thread_fun, ptT ); render_thread.join(); return 0; }
R6010 -abort() has been called
标签:
原文地址:http://www.cnblogs.com/wanghaiyang1930/p/4800504.html