2010-10-20 65 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無論如何都可以從文字初始化,所以我不確定爲什麼你甚至有兩個。只要有一個,不要施放任何常量。

相關問題