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