2012-01-02 79 views
2

儘管我已經閱讀過類似的問題,但這個問題似乎與典型的問題(靜態析構函數未被調用)完全相反。我正在用C++寫一個遊戲引擎,其中有幾個變量作爲靜態類成員。但是,似乎我並沒有正確初始化或使用它,因爲每當我嘗試調用靜態成員的析構函數時都會調用它。這是成員的定義和聲明:早期調用靜態析構函數

static CRendering RENDER_PIPELINE; 

(在CDisplay.h)

CRendering CDisplayCore::RENDER_PIPELINE; 

(在CDisplay.cpp)

這裏是表示析構函數調用一個調用棧,在我使用靜態變量的一種方法之後:

#0 ( Seventh::CRendering::~CRendering(this=0x7fffffffe5f0, __in_chrg=<value optimized out>) (/home/alberto/SeventhEngine/src/Rendering/CRendering.cpp:38) 
#1 0x4152d9 Seventh::CEntity::UpdateGameLogic(this=0x8812f0) (/home/alberto/SeventhEngine/src/EntityCore/CEntity.cpp:109) 
#2 0x416b68 Seventh::UpdateGameLogicGeneric<std::basic_string<char>, Seventh::CEntity*>(map=...) (include/functors.h:64) 
#3 0x416968 Seventh::CEntityManager::UpdateGameLogic(this=0x63dc10) (/home/alberto/SeventhEngine/src/EntityCore/CEntityManager.cpp:65) 
#4 0x413122 Seventh::CEngine::UpdateGameLogic(this=0x63dab0) (/home/alberto/SeventhEngine/src/Engine/CEngine.cpp:175) 
#5 0x412fe6 Seventh::CEngine::RunGame(this=0x63dab0) (/home/alberto/SeventhEngine/src/Engine/CEngine.cpp:130) 
#6 0x40e027 main(argc=1, argv=0x7fffffffe8d8) (/home/alberto/SeventhEngine/main.cpp:31) 

CEntity :: UpdateGameLogic中的代碼是:

CDisplay::_Render().RenderTexture(...); 

渲染紋理是CRendering的方法。 _Render()是成員的靜態獲取者。

這裏有什麼問題?

編輯_Render的定義()

static inline CRendering _Render() 
{ 
    return RENDER_PIPELINE; 
} 
+2

請你教'_Render()'的定義是什麼?我敢打賭,它會返回'CRendering'對象的*副本*。 – 2012-01-02 18:15:13

+0

@GregHewgill比答案好得多:)我會支持你的賭注。 – jrok 2012-01-02 18:16:30

+0

我發佈了_Render()的定義。你看到有什麼不對嗎? – 2012-01-02 18:17:51

回答

2

_Render()函數返回一個複製CRendering對象。嘗試將其更改爲:

static inline CRendering &_Render() 

以上聲明將返回參考單一的靜態CRendering對象。如果沒有&,C++將複製整個對象,並從函數中返回該對象(然後,使用返回值的代碼將在調用完成後立即調用該副本的析構函數)。

+0

這很有道理!固定!謝謝:) – 2012-01-02 18:21:11

1
static inline CRendering _Render() 
{ 
    return RENDER_PIPELINE; 
} 

您按照價值返回CRendering,即副本。你看到的可能是副本的破壞者。

也許你想

static inline CRendering &_Render() 
+0

問題修復!謝謝! – 2012-01-02 18:21:25