C++ 在以下情况下,纹理是如何被破坏的?

C++ 在以下情况下,纹理是如何被破坏的?,c++,textures,sprite,sfml,C++,Textures,Sprite,Sfml,在SFML教程中,据说当您执行以下操作时,纹理会被破坏:- sf::Sprite loadSprite(std::string filename) { sf::Texture texture; texture.loadFromFile(filename); return sf::Sprite(texture); } // error: the texture is destroyed here 当纹理正确返回时,它是如何被破坏的?对象纹理在其作用域结束时被

在SFML教程中,据说当您执行以下操作时,纹理会被破坏:-

sf::Sprite loadSprite(std::string filename) 
{ 
    sf::Texture texture; 
    texture.loadFromFile(filename); 

    return sf::Sprite(texture); 
} // error: the texture is destroyed here 

当纹理正确返回时,它是如何被破坏的?

对象
纹理
在其作用域结束时被破坏的——在函数的末尾。与堆上的数据(例如,您使用
new
创建的数据)相比,堆栈分配变量的情况总是如此

当你创建一个精灵时,如果你仔细观察,你实际上从不复制纹理,而只是给它一个参考。这意味着一旦纹理对象被破坏,你就会得到一个白色的精灵。

是正确的,为了补充他的伟大答案,我想提供一种克服这种情况的方法

您可以使
sf::Texture
成为一个类的成员变量,该类将在您需要时保持活动状态(游戏、场景等),只需传递
sf::Sprite
对象即可

然后,代码可以如下所示:

sf::Sprite loadSprite(std::string filename) 
{ 

    this->mTexture.loadFromFile(filename); 

    // then only make copy of the sprite object
    return sf::Sprite(texture); 
}
如果需要多个纹理(可能是这种情况),则应该有一个类来管理每个
sf::texture
对象,该类只返回指向该对象或新精灵的引用或指针,并且仅当它们不在内存中时才加载纹理


我用我使用的一个旧模板做了一个要点,它是。它适用于您想要的任何类型,您只需要创建一个资源子类,但我在这里不详细介绍。

您需要了解构造函数、析构函数、它们的作用以及它们的运行时间。在这种情况下,
纹理
的析构函数在变量超出范围时执行,无论发生什么情况。
是指针,请将其作为指针使用。或者不用说,这里也一样这是为了强调使用成员变量,我只是最近没有做很多C++,暂时忘记它是指针。