静态析构函数早期被调用

时间:2012-01-02 18:11:47

标签: c++ static destructor

虽然我已经阅读了类似的问题,但这个问题似乎与典型问题完全相反(静态析构函数未被调用)。我正在用C ++编写游戏引擎,其中我有几个vars作为静态类成员。但是,似乎我没有正确初始化或正确使用它,因为每当我尝试调用它时,都会调用静态成员的析构函数。这是该成员的定义和声明:

static CRendering RENDER_PIPELINE;

(在CDisplay.h中)

CRendering CDisplayCore::RENDER_PIPELINE;

(在CDisplay.cpp中)

这是一个显示析构函数调用的调用堆栈,在我使用静态var的一个方法之后:

#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(...);

RenderTexture 是一种CRendering方法。 _Render()是成员的静态getter。

这里有什么问题?

编辑 _Render()的定义

static inline CRendering _Render()
{
    return RENDER_PIPELINE;
}

2 个答案:

答案 0 :(得分:2)

您的_Render()函数返回CRendering对象的副本。尝试将其更改为:

static inline CRendering &_Render()

上述声明会将引用返回给单个静态CRendering对象。如果没有&,C ++将复制整个对象,并从函数中返回该对象(然后使用返回值的代码将在调用完成后立即调用该副本的析构函数。)

答案 1 :(得分:1)

static inline CRendering _Render()
{
    return RENDER_PIPELINE;
}

您按值返回CRendering,即副本。你看到的可能是副本的析构函数。

也许你想要

static inline CRendering &_Render()