尝试将sf::Texture*推入std::vector时出错 我正在使用一个使用SFML和Lua的C++项目。 问题是,当我试图推动我加载的纹理指针时,它崩溃了

尝试将sf::Texture*推入std::vector时出错 我正在使用一个使用SFML和Lua的C++项目。 问题是,当我试图推动我加载的纹理指针时,它崩溃了,c++,vector,sfml,C++,Vector,Sfml,这是我的密码 sf::Texture* tex = new sf::Texture; if(!tex->loadFromFile(lua_tostring(L, -1))) std::cout << "Failed to load texture!" << std::endl; std::cout << "Got here!" << std::endl; try{ p.tex_auras.pus

这是我的密码

    sf::Texture* tex = new sf::Texture;
    if(!tex->loadFromFile(lua_tostring(L, -1))) std::cout << "Failed to load texture!" << std::endl;
    std::cout << "Got here!" << std::endl;
    try{
        p.tex_auras.push_back(tex);
    }catch(std::invalid_argument& e){
        std::cout << "Error: " << e.what() << std::endl;
    }
sf::Texture*tex=新的sf::Texture;

如果(!tex->loadFromFile(lua_-tostring(L,-1)))std::cout我宁愿将此作为评论发布,但我没有足够的代表


虽然这不能完全解决错误,但是如果将
catch
块更改为
}catch(std::exception&e){
而不是
}catch(std::invalid_argument&e),则可以避免崩溃{
。引发的异常可能不是无效的\u参数异常,捕获所有异常作为捕获所有异常更有效。假设这样做有效,您还可以得到一条信息更丰富的错误消息,从而更好地了解出错的原因。

显然,在我加载userdat之后,播放器首先是空的a来自lua。我在错误的堆栈索引上

您所描述的内容强烈暗示
p.tex\u auras
不是一个有效的
std::vector
对象,您可以将其推入。与此代码相关的向量声明的确切位置,以及它是如何初始化的?请提供一个。在旁注中,
push\u back()
永远不会抛出
std::invalid_参数
异常。如果有任何异常,它只能在推送无法分配内存时抛出
std::bad_alloc
,或者如果数组重新分配将超过向量的
max_size()时抛出
std::length_错误
。我认为您没有显示足够的代码。在调用
std::vector::push_back
时,唯一会使程序崩溃的是没有内存,并且您没有处理
std::bad_alloc
异常。我会说
p
p.tex_auras
可能不是内存中的有效对象。或者您某个地方的ave堆栈或堆损坏。我已更新了问题。这不应该是问题,因为它不是指针。它将自动调用默认构造函数,但当我创建播放器@RemyLebeau时,“不应该是问题,因为它不是指针”-仅仅因为某些东西不是指针并不意味着它不能无效,例如如果内存损坏,或者您正在使用悬空引用,等等。您的更新仍然不是一个指针,因为它没有显示
p
是如何声明和初始化的。我建议
-fsanize=address
,看看能给出什么快速结果并添加它如果你不能从中找出答案,请向MRE提供信息。
        void push_back(const value_type &__x) {
            if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage) {          <<== HERE ==
                _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
                        __x);
                ++this->_M_impl._M_finish;
            } else
                _M_realloc_insert(end(), __x);
        }
typedef std::vector<sf::Texture*> Textures;
// The textures was initialized in a class as such
class Player {
public:
     // Just like that
     Textures tex_auras;
}