gpt4 book ai didi

c++ - 导致奇怪行为的共享指针

转载 作者:行者123 更新时间:2023-11-30 00:50:35 24 4
gpt4 key购买 nike

我在 SFML 2.1 中有以下代码

类资源管理器:

shared_ptr<Sprite> ResourceManager::getSprite(string name) {
shared_ptr<Texture> texture(new Texture);
if(!texture->loadFromFile(resPath+spritesPath+name))
throw new NotSuchFileException();
shared_ptr<Sprite> sprite(new Sprite(*texture));
return sprite;
}

主要方法:(我将省略大部分不相关的代码

shared_ptr<Sprite> sprite = ResourceManager::getSprite("sprite.png");

...

while(renderWindow.isOpen())
renderWindow.draw(*sprite);

奇怪的是,这让我的 Sprite 呈现完全白色,但如果我这样做:

shared_ptr<Sprite> ResourceManager::getSprite(string name) {
Texture* texture = new Texture; // <------- From shared pointer to pointer
if(!texture->loadFromFile(resPath+spritesPath+name))
throw new NotSuchFileException();
shared_ptr<Sprite> sprite(new Sprite(*texture));
return sprite;
}

它完美地工作。

那么这里发生了什么?我假设共享指针会像指针一样工作。难不成是被删了?我的主要方法是保留对它的引用,所以我真的不明白这里发生了什么:S

编辑:我完全清楚删除 Sprite 不会删除纹理,这会产生我必须处理的内存泄漏,这就是我首先尝试使用智能指针的原因......

最佳答案

我可能离这里很远,但我认为值得一试:

如果 sprite 类构造函数采用常规 Texture * 或 Texture 引用(而不是采用和存储共享指针),那么当 shared_ptr 超出 getSprite 的范围时,纹理将被销毁(因为没有 shared_ptr 指向纹理在该点之后存在)。

关于c++ - 导致奇怪行为的共享指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24567981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com