2012-01-02 73 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