我正在尝试基于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
,这是不平凡的。