【问题标题】:Static destructor getting called early静态析构函数被提前调用
【发布时间】:2012-02-01 00:01:06
【问题描述】:

虽然我已经阅读了类似的问题,但这个问题似乎与典型问题完全相反(未调用静态析构函数)。我正在用 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(...);

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

这可能是什么问题?

编辑 _Render() 的定义

static inline CRendering _Render()
{
    return RENDER_PIPELINE;
}

【问题讨论】:

  • 您能说明_Render() 的定义吗?我敢打赌它会返回您的CRendering 对象的副本
  • @GregHewgill 比答案好得多:) 我会支持你的赌注。
  • 我贴出了_Render()的定义。你看出什么不对了吗?

标签: c++ static destructor


【解决方案1】:

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

static inline CRendering &_Render()

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

【讨论】:

  • 有道理!固定的!谢谢:)
【解决方案2】:
static inline CRendering _Render()
{
    return RENDER_PIPELINE;
}

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

也许你想要

static inline CRendering &_Render()

【讨论】:

    猜你喜欢
    • 2011-05-20
    • 2010-10-16
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    相关资源
    最近更新 更多