版權所有,轉載請注明出處。
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; }