R6010 -abort() has been called


版權所有,轉載請注明出處。

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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM