zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    完全开源Android网络框架 — 基于JAVA原生的HTTP框架
    博客园—Android客户端
    撸一个Android高性能日历控件,高仿魅族
    Android开发登陆博客园的正确方式
    基于pthread的线程池实现
    重复造轮子系列——基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印
    重复造轮子系列——基于Ocelot实现类似支付宝接口模式的网关
    零基础ASP.NET Core WebAPI团队协作开发
    零基础ASP.NET Core MVC插件式开发
    jquery对下拉框的操作
  • 原文地址:https://www.cnblogs.com/wanghaiyang1930/p/4800504.html
Copyright © 2011-2022 走看看