2014-04-01 20 views
3

我正在D中創建一個SDL-OpenGL應用程序。我正在使用廢棄SDL綁定來完成此操作。無法在SDL_GL_DeleteContext中析構函數

當我完成運行我的應用程序時,我想卸載SDL。要做到這一點,我運行以下功能:

public ~this() { 
    SDL_GL_DeleteContext(renderContext); 
    SDL_DestroyWindow(window); 
} 

出於某種原因,然而,這會給我一個模糊的分段錯誤(在GDB任何痕跡),並返回-11。我是否可以在析構函數中銷燬SDL,在使用後我甚至不得不銷燬SDL?

我的構造函數:

window = SDL_CreateWindow("TEST", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN_DESKTOP); 
if(window == null) { 
    string error = to!string(SDL_GetError()); 
    throw new Exception(error); 
} 

renderContext = SDL_GL_CreateContext(window); 
if(renderContext == null) { 
    string error = to!string(SDL_GetError()); 
    throw new Exception(error); 
} 
+0

可以顯示ctor和一些代碼.- – this

+0

@self我自己也添加了我的構造函數。 –

+0

它改變了什麼,如果你讓他們'共享靜態this'和'共享靜態〜這個'?如果沒有共享,它們會針對每個線程完成,並且可能會導致問題。 –

回答

1

類的析構函數可以在不同的線程比在其中創建類的線程中運行。可能會發生崩潰,因爲OpenGL或SDL可能無法正確處理來自其他線程的清理。

堆分配(GC管理)對象的析構函數不是執行清理的好方法,因爲它們的調用無法保證。而是將代碼移到清理函數中,或者使用確定性方式來完成對象(reference counting或手動內存管理)。