C ++无法返回纹理向量

时间:2019-07-04 15:43:36

标签: c++ sfml

我有一个跟踪已声明对象的类。此类也有一个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];

1 个答案:

答案 0 :(得分:0)

*textures[id]->variation[no];的代码中有两种崩溃的可能性

  1. 您必须在堆栈中创建ItemTexture的对象,然后ItemTexture的构造函数将this指针推回向量textures。如果您创建的对象超出范围,则向量textures将具有悬空指针,因为指向它的对象已被破坏。或者,您可以像使用sf :: Texture一样删除它,如下面第二种可能的原因所述。这会导致*textures[id]的{​​{1}}部分崩溃。

解决方案:动态分配它,直到完成此操作(诸如*textures[id]->variation[no];之类的调用),才将其删除。

  1. 您正在使用getTexture()动态创建对象Texture,并使用sf::Texture *tex = new sf::Texture;删除对象Texture。因此,用delete tex;推动的任何内容都将变为悬空指针。 variation.push_back(tex);充满了悬空的指针,当您访问它时,应用程序崩溃。如果不是上述问题之一,则会导致variation的{​​{1}}部分崩溃。

解决方案:删除variation[no]并将其释放到析构函数中。