【发布时间】: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<SDL_Texture> texture = window.loadTexture("res/images/texture.png"),每次创建新对象时都会复制它,因此智能指针将始终存在。 -
那么,你到底想做什么,完全不清楚。 shared_ptr 导致被引用对象的析构函数只有在引用对象的所有 shared_ptr 都消失后才被调用。而已。这就是 shared_ptr 的工作原理,也是使用它的唯一原因。如果您不希望这种行为发生,则必须使用其他方法。