Hi
I'm working on a program that uses Gtkmm for the GUI under windows. The program also uses Gtkglextmm for creating a opengl capable window and GLEW for getting a OpenGL 3 context.
Things work well until I try to create a shader. The program creates an ifstream, loads the file, compiles it into a gl program. Then the program calls close() on the ifstream. Then the ifstream variable goes out of scope. When the ifstream variable goes out of scope it crashes in the deconstructor.
I think I've removed most except for what is causing the problem. But first the error message:
And the visual studio 2012 debugger brings me to this line in: istreamCode:Unhandled exception at 0x0f738a7f (msvcp100d.dll) in FlowerModelerGtkmm.exe: 0xC0000005: Access violation reading location 0x00000004.
And now here is the code that is causing the problem:Code:virtual __CLR_OR_THIS_CALL ~basic_istream() { // destroy the object }
Main.cpp
Code:#include <gl\glew.h> #include <gtkmm\main.h> #include <gtkglext\gtkglmm.h> #include <iostream> #include "ControlsWindow.h" #include "OrganEditorWindow.h" #include "DiagramEditorWindow.h" #include "ModelViewportWindow.h" #include "Flower.h" #include "GTKGLUtil.h" int main(int argc, char* argv[]) { Gtk::Main kit(argc, argv); Gtk::GL::init(argc, argv); Glib::RefPtr<Gdk::GL::Config> glconfig; glconfig = Gdk::GL::Config::create(Gdk::GL::MODE_RGB | Gdk::GL::MODE_DEPTH | Gdk::GL::MODE_DOUBLE); if(!glconfig) { std::cout<<"Unable to make a double buffered context"<<std::endl; glconfig = Gdk::GL::Config::create(Gdk::GL::MODE_RGB | Gdk::GL::MODE_DEPTH); if(!glconfig) { std::cout<<"Unable to create single buffered context."<<std::endl; std::exit(1); } } GLConfigUtil::examine_gl_attrib(glconfig); Flower flower; OrganEditorWindow organEditor(glconfig, flower); organEditor.show(); if(glewInit() != GLEW_OK) { std::cout<<"Failed to initialize glew"<<std::endl; } int major, minor; Gdk::GL::query_version(major, minor); std::cout<<"Opengl extension version: "<<major<<"."<<minor<<std::endl; std::cout<<"Opengl Version: "<<glGetString(GL_VERSION)<<std::endl; Shader *shader = new Shader(); shader->Init("textVertShader.glsl", "textFragShader.glsl"); //<-- code crahses in here kit.run(); return 0; }
And Shader.cpp
Code:bool Shader::Init(std::string vShaderFile, std::string fShaderFile) { { std::ifstream fin; fin.open(vShaderFile); if(!fin.is_open()) { std::cout<<"Unable to open the vertex shader source file: "<<vShaderFile<<std::endl; return false; } { std::string vShaderSource((std::istreambuf_iterator<char>(fin)), std::istreambuf_iterator<char>()); vShaderId = CompileShader(GL_VERTEX_SHADER, vShaderSource); checkError("Init->vShader"); } fin.clear(); fin.close(); }// <-- This is where the program crashes. { std::ifstream fin; fin.open(fShaderFile); if(!fin.is_open()) { std::cout<<"Unable to open the fragment shader source file: "<<fShaderFile<<std::endl; return false; } { std::string fShaderSource((std::istreambuf_iterator<char>(fin)), std::istreambuf_iterator<char>()); this->fShaderId = CompileShader(GL_FRAGMENT_SHADER, fShaderSource); checkError("Init->fShader"); } } { CreateProgram(this->vShaderId, this->fShaderId); checkError("Init->CreateProgram"); } if(this->progId > 0) { return true; } return false; }
I've tried playing around with the scope of the ifstream variable and using close and not using close. It always crashes when going out of scope.
I'm at a loss. This code worked before I started converting it to Gtkmm, and currently works in other programs (one using freeglut and another allegro). This is also my first attempt at using Gtkmm/Gtk+.
Any help is appreciated.



3Likes
LinkBack URL
About LinkBacks


