【发布时间】:2020-09-28 02:16:51
【问题描述】:
我正在开发一个使用 SFML 和 lua 的 C++ 项目 问题是当我试图推动加载的纹理指针时它崩溃了。
这是我的代码
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;
}
如果我注释掉 push_back 的东西,一切都很好。此外,代码吐出 Got here! 一次,如果尝试检查 tex->loadFromFile() 以查看它是否失败,它没有。当我调试代码时,它似乎发生在 std::vector::push_back
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;
}
不知道怎么回事
【问题讨论】:
-
您所描述的强烈暗示
p.tex_auras不是您可以推入的有效std::vector对象。与这段代码相关的向量究竟在哪里声明,它是如何初始化的?请提供minimal reproducible example。附带说明一下,push_back()永远不会抛出std::invalid_argument异常。如果有的话,它只能在推送无法分配内存时抛出std::bad_alloc,或者如果数组重新分配将超过向量的max_size(),则可能std::length_error。 -
我认为您显示的代码不足。调用
std::vector::push_back时唯一会使程序崩溃的情况是,如果没有剩余内存并且您没有处理std::bad_alloc异常。我会说p或p.tex_auras可能不是内存中的有效对象。或者你在某个地方有堆栈或堆损坏。 -
我已经更新了问题。不应该是一个问题,因为它不是一个指针。当我创建播放器@RemyLebeau 时,它会自动调用默认构造函数
-
"应该不是问题,因为它不是指针" - 仅仅因为某些东西不是指针并不意味着它不能是无效的,例如如果内存已损坏,或者您正在使用悬空引用等。您的更新仍然不是minimal reproducible example,因为它没有显示
p是如何声明和初始化的。 -
我建议
-fsanitize=address看看能提供什么快速结果,如果您无法从中找出答案,请将这些信息添加到 MRE。