【问题标题】:How to Manually call a Destructor on a Smart Pointer?如何在智能指针上手动调用析构函数?
【发布时间】:2021-12-12 21:45:23
【问题描述】:

在我正在制作的游戏中,我有一个 shared_ptr SDL_Texture。我想使用共享指针能够在多个对象上使用相同的纹理而不会泄漏任何内存。我从一个方法返回共享指针

std::shared_ptr<SDL_Texture> RenderWindow::loadTexture(const char *filePath) {

    return std::shared_ptr<SDL_Texture>(IMG_LoadTexture(renderer, filePath),
            SDL_DestroyTexture);
}

但是,当我在游戏中使用完纹理后,我希望能够手动调用它的析构函数 SDL_DestroyTexture 但是当我需要它时不会调用它,它占用了很多内存。有没有办法告诉它在我想要的时候调用它的析构函数?

【问题讨论】:

  • 当引用计数下降到 0 时,它将被销毁。如果没有销毁,则意味着您仍然有对它的引用。
  • shared_ptr 的全部目的是当所有指向它的指针都消失时销毁引用的对象。如果您想在该点之前销毁被引用的对象:1)不要使用 shared_ptr,2)弄清楚该对象被销毁后所有其他剩余的指针/引用应该做什么。
  • @SamVarshavchik 对象上使用的智能指针在 Game 类中定义为 std::shared_ptr&lt;SDL_Texture&gt; texture = window.loadTexture("res/images/texture.png"),每次创建新对象时都会复制它,因此智能指针将始终存在。
  • 那么,你到底想做什么,完全不清楚。 shared_ptr 导致被引用对象的析构函数只有在引用对象的所有 shared_ptr 都消失后才被调用。而已。这就是 shared_ptr 的工作原理,也是使用它的唯一原因。如果您不希望这种行为发生,则必须使用其他方法。

标签: c++ sdl-2


【解决方案1】:

您可以通过在 shared_ptr 上调用 reset() 来释放对象的所有权。如果这是最后一个持有指针,shared_ptr 的 deleter 成员将用于销毁该对象。

https://en.cppreference.com/w/cpp/memory/shared_ptr/reset

【讨论】:

  • 如果有任何剩余的对指针的引用(当我调用它时不会有)当我这样做时会发生什么reset()
  • @Gold87 - 如果有剩余的引用(由其他shared_ptrs),则不会调用包含对象的析构函数。也就是说,或多或少,shared_ptr 的目的是在保持对托管对象的任何引用时保持其活动状态。
猜你喜欢
  • 2016-03-20
  • 2012-04-17
  • 1970-01-01
  • 2011-04-06
  • 2018-02-02
  • 2021-09-26
  • 1970-01-01
  • 2018-05-13
  • 2011-03-20
相关资源
最近更新 更多