EXC_BAD_ACCESS当我尝试检查 NULL 时

EXC_BAD_ACCESS when I'm trying to check for NULL

本文关键字:检查 NULL BAD ACCESS EXC      更新时间:2023-10-16

我正在尝试基于Lazyfoo的Awesome Tutorials(http://lazyfoo.net/tutorials/sdl/sdl/10_color_keying/index.php),但是当我时尝试运行它,尽管我正在尝试测试该指针是否为null,但该线程在指针上为我提供了一个指针上的exc_bad_access(代码= 1,地址= 0x0)。这是班级的样子:

//Texture wrapper class
class LTexture
{
public:
    //Initializes variables
    LTexture();
    //Deallocates memory
    ~LTexture();
    //Loads image at specified path
    bool loadFromFile(std::string path);
    //Deallocates texture
    void free();
    //Renders a texture at a given point
    void render(int x, int y);
    //Gets an image's dimensions
    int getWidth();
    int getHeight();
private:
    //The actual hardware texture
    SDL_Texture* mTexture = NULL;
    //Image dimensions
    int mWidth;
    int mHeight;
};

这是Intial和销毁方法:

LTexture::LTexture()
{
    //Initialize
    mTexture = NULL;
    mWidth = 0;
    mHeight = 0;
    printf("I initialized");
}
LTexture::~LTexture()
{
    free();
}

我的错误在于 LTexture::free方法。

void LTexture::free()
{
    //Free texture if it exists
    if (mTexture != NULL) //HERE IS THE ISSUE. WHAT IS WRONG WITH THIS?
    {
        SDL_DestroyTexture(mTexture);
        mTexture = NULL;
        mWidth = 0;
        mHeight = 0;
    }
}

您可以在线看到,当我测试mextule是否为null时,出现问题,我认为这应该是有效的,但由于某种原因不是。我究竟做错了什么?发布更多代码会有所帮助吗?

问题可能是您不处理复制和移动。

每当您复制LTexture时,仅复制指针。如果该副本不在范围内,则称为击曲线。然后,原件在某个时刻脱离范围,并且在同一指针上再次调用击曲线。

我建议使用智能指针:

#include <memory>
class TextureDeleter { void operator()(SDL_Texture* t) { SDL_DestroyTexture(t); };
// in the class
std::unique_ptr<SDL_Texture, TextureDeleter> mTexture;

然后您可以删除破坏者。

edit :如果您真的不想使用<memory>,则只需添加

即可实现相同的安全性
LTexture(const LTexture &) = delete;
LTexture& operator=(const LTexture &) = delete;
LTexture(LTexture &&) = delete;
LTexture& operator=(LTexture &&) = delete;

到您的班级。

但是,正如评论中指出的那样,这仅在您实际上不需要移动或复制课程时才有效。如果这样做,则必须使用shared_ptr,这是不平凡的。