我有一个跟踪已声明对象的类。此类也有一个vector作为成员。我通过一个函数添加纹理(可能存在泄漏)。我可能是对c ++本身而不是sfml犯了一个错误。
在Item.h中:
#ifndef ITEM_H
#define ITEM_H
class ItemTexture {
public:
static std::vector<ItemTexture*> textures;
std::vector<sf::Texture*> variation;
ItemTexture(std::string file);
void addTexture(std::string file);
static sf::Texture getTexture(int id, int no) {
return *textures[id]->variation[no]; //Program crashes here
}
static void declare_textures();
};
#endif
在Item.cpp中:
#include "Item.h"
std::vector<ItemTexture*> ItemTexture::textures;
ItemTexture::ItemTexture(std::string file)
{
sf::Texture *tex = new sf::Texture;
tex->setSmooth(false);
tex->loadFromFile(file);
variation.push_back(tex);
textures.push_back(this);
delete tex;
}
void ItemTexture::addTexture(std::string file)
{
sf::Texture *tex = new sf::Texture;
tex->setSmooth(false);
tex->loadFromFile(file);
variation.push_back(tex);
delete tex;
}
这不给出任何错误消息,程序在返回行时崩溃* textures [id]-> variation [no];
答案 0 :(得分:0)
在*textures[id]->variation[no];
的代码中有两种崩溃的可能性
ItemTexture
的对象,然后ItemTexture
的构造函数将this
指针推回向量textures
。如果您创建的对象超出范围,则向量textures
将具有悬空指针,因为指向它的对象已被破坏。或者,您可以像使用sf :: Texture一样删除它,如下面第二种可能的原因所述。这会导致*textures[id]
的{{1}}部分崩溃。解决方案:动态分配它,直到完成此操作(诸如*textures[id]->variation[no];
之类的调用),才将其删除。
getTexture()
动态创建对象Texture,并使用sf::Texture *tex = new sf::Texture;
删除对象Texture。因此,用delete tex;
推动的任何内容都将变为悬空指针。 variation.push_back(tex);
充满了悬空的指针,当您访问它时,应用程序崩溃。如果不是上述问题之一,则会导致variation
的{{1}}部分崩溃。解决方案:删除variation[no]
并将其释放到析构函数中。