2010-10-20 36 views
1

我已经为allegro位图制作了一个C++包装器。我创建一个AguiBitmap为测试一个全局变量,再后来我说,快板已初始化当析构函数被调用时从0xfefefefe读取错误

bitmap = AguiBitmap("somepath"); 

后。

然而,当我关闭应用程序,它崩溃的位图的析构函数。如果我做al_destroy_bitmap(0);它很好,但是我的位图指针没有任何问题,因为我用它来渲染。

AguiBitmap::~AguiBitmap() 
{ 
     al_destroy_bitmap(nativeBitmapPtr); 
} 

AguiBitmap::AguiBitmap() 
{ 
    nativeBitmapPtr = 0; 
    width = 0; 
    height = 0; 
} 

AguiBitmap::AguiBitmap(char *filename) 
{ 

    if(!filename) 
    { 
     nativeBitmapPtr = 0; 
     return; 
    } 

    nativeBitmapPtr = al_load_bitmap(filename); 

    if(nativeBitmapPtr) 
    { 

     width = al_get_bitmap_width(nativeBitmapPtr); 
     height = al_get_bitmap_height(nativeBitmapPtr); 
    } 
    else 
    { 
     width = 0; 
     height = 0; 
    } 
} 

AguiBitmap::AguiBitmap(std::string filename) 
{ 
    AguiBitmap((char*)filename.c_str()); 
} 

ALLEGRO_BITMAP* AguiBitmap::getBitmap() const 
{ 
    return nativeBitmapPtr; 
} 

int AguiBitmap::getWidth() const 
{ 
    return width; 
} 

int AguiBitmap::getHeight() const 
{ 
    return height; 
} 

感谢

回答

3

你没有定义拷贝构造函数(编辑:或拷贝赋值运算符)。

bitmap = AguiBitmap("somepath"); 

即线构造了一个临时AguiBitmap该分配位图,然后分配到bitmap变量和临时被破坏,释放该位图。因此,任何使用bitmap此行后无效!

编辑:具体地,当bitmap超出范围,析构函数被调用的第二对象和相同的位图被再次删除。

+0

我该如何制作复制构造函数? – jmasterx 2010-10-20 04:03:12

+1

@Milo:[一本很好的C++入门书](http://stackoverflow.com/questions/388242/the-definitive-c++-book-guide-and-list)将解释正确的C++内存管理,对象生命周期和问题与实施拥有资源的容器有关。具体来说,我推荐阅读Herb Sutter的_Exceptional C++ _。项目8-19和35-41深入讨论了这个问题。 – 2010-10-20 04:05:51

+1

该行调用复制赋值运算符,而不是复制构造函数。 – 2010-10-20 04:10:10

2

如果您正在使用Visual C++,Windows的调试堆覆写释放的内存与0xfe内存模式,以帮助您调试内存问题。

你已经释放的东西,无论是(a)您试图访问该事物或(b)您正试图再次释放那个东西。

由于类手工管理资源,既然你不显示拷贝构造函数和拷贝赋值运算符实现,确保你跟随rule of three

1

是快板正在main关闭?如果是这样,那么当全球自毁main,我怀疑al_destroy_bitmap应该失败。

就像詹姆斯说的,你打破了三条规则;这可能起到一定的作用。此bitmap = AguiBitmap("somepath");将在临时死亡时致电al_destroy_bitmap(nativeBitmapPtr);;这是否带有错误的指针bitmap


除了这个问题,为什么你有一个char*重载的构造函数?这很讨厌。 C风格的演员表现得像const_cast,这应该是暗示有些事情是错误的。 std::string无论如何都可以从文字初始化,所以我不确定为什么你甚至有两个。只要有一个,不要施放任何常量。

相关问题