C++不能返回纹理矢量

C++不能返回纹理矢量,c++,sfml,C++,Sfml,我有一个类,它跟踪我声明的对象。这个类还有一个向量作为成员。我通过一个函数添加纹理,可能有漏洞。我可能犯了一个关于C++本身的错误,而不是SFML。 在项目h中: #ifndef ITEM_H #define ITEM_H class ItemTexture { public: static std::vector<ItemTexture*> textures; std::vector<s

我有一个类,它跟踪我声明的对象。这个类还有一个向量作为成员。我通过一个函数添加纹理,可能有漏洞。我可能犯了一个关于C++本身的错误,而不是SFML。 在项目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]时崩溃

在*textures[id]->variation[no]处有两种可能导致代码崩溃

您必须在堆栈中创建ItemTexture的对象,然后ItemTexture的构造函数将此指针向后推到矢量纹理。如果创建的对象超出范围,矢量纹理将有一个悬空指针,因为它指向的对象已被破坏。或者,您可以像使用sf::Texture一样删除它,如下面第二个可能的原因所述。这导致*textures[id]部分*textures[id]->变化[no];使崩溃。 解决方案:动态分配它,在完成诸如getTexture之类的调用之前不要删除它

您正在使用sf::Texture*tex=new sf::Texture动态创建对象纹理;并使用delete tex;删除该文件;。所以,无论你用变化推动什么;变为悬空指针。变体中充满了悬空指针,当您访问它时,应用程序就会崩溃。这导致*纹理[id]->变化[no]的变化[no]部分;如果不是上述问题,则会导致崩溃。
解决方案:删除删除tex;在析构函数中释放它。

这是因为在将它们推回到向量之后删除纹理,所以向量包含所有被删除的纹理*s。这不给出任何错误消息——这一切意味着C++代码是有效的。这与程序的逻辑是否正确无关。@PaulMcKenzie甚至不是这样。显然,OP删除了一些东西,然后引用它,这是UB,因此不正确的C++代码。编译无错误是代码中不存在非常狭窄的问题的保证,C++允许这样的不完整代码编译而不出错。我看到很多新手发布了它编译的行ok,但是…,好像它编译的ok真的意味着什么。这不会给出任何错误消息,-不幸的是,没有编译器警告/错误并不意味着你的代码是有效的或做任何合理的事。C++中有很多语言将让你编写,编译器会编译,这仍然是无意义的或没有定义的行为,而不需要诊断。它编译的正确性非常低,远远不足以显示没有错误。非常感谢!你的第一个答案似乎是正确的,我没有打电话给你。这是个愚蠢的错误,我还是个新手,谢谢!