2012-03-19 9 views
10

上でコンパイルする場合にのみ、それが実行されるたび、それがコンパイルされますが、私は、このエラーを与える:ヒープの破損が、私は私のデスクトップに私のラップトップ上で完全に罰金コンパイルプログラムをコンパイルしようとしているラップトップ

Windowsの持っていますRR.exeでブレークポイントがトリガーされました。

これは、 RR.exeまたはそれがロードしたDLLのバグを示す、ヒープの破損による可能性があります。

これは、RR.exeにフォーカスがある間にユーザーがF12キーを押したことが原因と考えられます。

出力ウィンドウには、より多くの診断情報が含まれている場合があります。

if(glfwOpenWindow(width_, height_, 0, 0, 0, 0, 32, 0, GLFW_WINDOW) != GL_TRUE) { 
    throw std::runtime_error("Unable to open GLFW window"); 
} 

私は、例えば、定数でwidth_height_を交換する場合は奇妙なことがある:私はエラーになります行を見つけたまで、私は行をコメントアウトしまし

それぞれ800と600、ヒープの破損を停止します。また、値を渡す代わりにコンストラクタによって設定されたデフォルト値を使用するだけで、クラッシュすることはありません。

完全なコードは次のとおりです。上記の行は、Windowコンストラクタにあります。

window.h

#pragma once 

#include <iostream> 
#include <GL\glew.h> 
#include <GL\glfw.h> 

#pragma comment(lib, "opengl32.lib") 
#pragma comment(lib, "glu32.lib") 
#pragma comment(lib, "glew32.lib") 
#pragma comment(lib, "GLFW.lib") 

class Window { 
public: 
    Window(unsigned width = 800, unsigned height = 600); 
    ~Window(); 

    void clear(); 
    inline void display() { glfwSwapBuffers(); } 
    inline bool exit() { return !glfwGetWindowParam(GLFW_OPENED); } 

private: 
    unsigned width_, height_; 
}; 

window.cpp

#include "window.h" 

Window::Window(unsigned width, unsigned height) : width_(width), height_(height) { 
    if(glfwInit() != GL_TRUE) { 
     throw std::runtime_error("Unable to initialize GLFW"); 
    } 

    if(glfwOpenWindow(width_, height_, 0, 0, 0, 0, 32, 0, GLFW_WINDOW) != GL_TRUE) { //crash 
    //if(glfwOpenWindow(800, 600, 0, 0, 0, 0, 32, 0, GLFW_WINDOW) != GL_TRUE) { //no crash 
     throw std::runtime_error("Unable to open GLFW window"); 
    } 

    GLenum result = glewInit(); 
    if(result != GLEW_OK) { 
     std::stringstream ss; 
     ss << "Unable to initialize glew: " << glewGetErrorString(result); 
     throw std::runtime_error(ss.str()); 
    } 
} 

Window::~Window() { 
    glfwTerminate(); 
} 

void Window::clear() { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
} 

main.cppに

#include "window.h" 

int main() { 
    Window wind(1024, 800); //crash 
    Window wind(800, 600); //crash 
    Window wind(); //works 

    return 0; 
} 
+3

+1完全な、比較的短いテスト・ケースを供給するため。 –

+1

はあなたのを確認しました両方のマシンでシステム/ランタイムDLLのバージョンがまったく同じですか? –

+0

これらは、まったく同じDLL、.libs、およびproです。私はドロップボックスにそれらを保つようにject。 – Lerp

答えて

6

問題がGLFWにつながるようだ:

私はあなたが動的にGLFWをリンクを使用しようとしている、と仮定します。 GLFWヘッダー内注:

#if defined(_WIN32) && defined(GLFW_BUILD_DLL) 

/* We are building a Win32 DLL */ 
#define GLFWAPI  __declspec(dllexport) 
#define GLFWAPIENTRY __stdcall 
#define GLFWCALL  __stdcall 
#elif defined(_WIN32) && defined(GLFW_DLL) 

/* We are calling a Win32 DLL */ 
#if defined(__LCC__) 
    #define GLFWAPI  extern 
#else 
    #define GLFWAPI  __declspec(dllimport) 
#endif 
#define GLFWAPIENTRY __stdcall 
#define GLFWCALL  __stdcall 

#else 

/* We are either building/calling a static lib or we are non-win32 */ 
#define GLFWAPIENTRY 
#define GLFWAPI 
#define GLFWCALL 

#endif 

GLFW_BUILD_DLLは明らかにDLLを構築しながら設定し、それが__stdcall呼び出して変換してAPI関数を定義しました。

ライブラリを使用する場合、GLFW_DLLを定義していないため、コードでは__cdeclの呼び出し変換を想定しています。_cdecl__stdcallの違いは、一般的に呼び出し元関数はスタックを最初にクリーニングし、呼び出し先最後のケースであるべきです。だから、スタックを2回きれいにしてしまったので、スタックの破損が起こったのです。

プログラムにglfwを含める前にGLFW_DLLを定義した後、正しく動作するようになりました。また、私はmingwを使い、GLFW_DLLを定義した後にglfw.aの代わりにglfwdll.aとリンクしなければならなかったことにも注意してください。

+0

これも私のために働いた。また、マルチスレッドDLLのランタイムライブラリをマルチスレッドDLLに変更することで、動作させることもできました。変数の代わりに定数値を渡してヒープの破損が発生しなかった理由を説明できますか?すべての引数が一定であるように、関数を異なるように呼び出すか? – Lerp

+0

@Rarge、 "マルチスレッドDLL用のランタイムライブラリDLLからマルチスレッドDLL"は、GLFWではなくWinCRTのものと接続されているようです。定数値を設定したり、プロジェクト設定を変更したりすることは、破損を起こすことはありませんが、それを隠すだけです。 – Lol4t0

1

ヒープ破損のバグalmomst彼らがもともと発生した時点で明らかにすることはありません。それは、診断するのがとても痛いものです。あるシステムで動作し、別のシステムでは動作しないという事実は、未定義の動作を意味します。

あなたのコードをすばやく調べる際に、明らかなバグはありませんでした。 Purify for Windowsへのアクセス権がある場合や、Linuxでのコンパイル機能の代わりにvalgrindを使用することができます。これらのツールのいずれかが、私が信じている単純なコード検査よりもずっと高い成功の変化をもたらすでしょう。

0

は、別の解決策は、私が出会った:

をランタイムライブラリを(変更することでプロジェクトのプロパティ]> [C/C++>マルチスレッドDLLへのマルチスレッドデバッグDLL(/ MDD)(/ MD)ヒープ破損からなし長く発生しました。

をしかし、おそらくより多くの知識を持つ人は、この上でいくつかの光を当てることができことができますなぜ私にはわからない。

関連する問題