虽然我已经阅读了类似的问题,但这个问题似乎与典型问题完全相反(静态析构函数未被调用)。我正在用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;
}
答案 0 :(得分:2)
您的_Render()
函数返回CRendering
对象的副本。尝试将其更改为:
static inline CRendering &_Render()
上述声明会将引用返回给单个静态CRendering
对象。如果没有&
,C ++将复制整个对象,并从函数中返回该对象(然后使用返回值的代码将在调用完成后立即调用该副本的析构函数。)
答案 1 :(得分:1)
static inline CRendering _Render()
{
return RENDER_PIPELINE;
}
您按值返回CRendering
,即副本。你看到的可能是副本的析构函数。
也许你想要
static inline CRendering &_Render()