2010-02-09 87 views
1

我一直在創建一個類,它需要一堆圖像並將它們覆蓋到一個BMP上。出於某種原因,在運行代碼時,我得到了段錯誤,並且我已經將其跟蹤到了這種方法。從本質上說,if語句會檢查圖像數組中是否存在有效的索引以放置此新圖像。如果該圖像有效,則會刪除先前存在的任何圖像,並將該索引設置爲此新圖像。該類被稱爲場景,並由一組圖像指針組成。所以我正在做的是取代那些指針指向的圖像。不知何故,它不工作。如果指針爲NULL,那麼刪除命令不應該引起任何問題,所以我沒有看到有什麼問題。此代碼正在具有長度爲5的圖像指針陣列的場景上運行。調用時總線錯誤刪除(C++)

void Scene::addpicture(const char* FileName, int index, int x, int y) 
{ 
if (index<0 || index>maxnum-1) 
{ 
    cout << "index out of bounds" << endl; 
} 

else 
{ 
     Image* extra; 
     extra = new Image; 
     extra->ReadFromFile(FileName); 

     delete imagelist[index]; 


     imagelist[index] = extra; 
     imagelist[index]->xcoord=x; 
     imagelist[index]->ycoord=y; 
} 
} 

任何人都可以幫忙。這將非常感激。

感謝

我已經編輯成包括構造函數:

Scene::Scene(int max) 
{ 
Image** imagelist = new Image*[max]; 
for(int i=0; i<max; i++) 
{imagelist[i] = NULL;} 

maxnum = max; 
} 

我也註釋掉的主要方法,使被調用的函數只有

Scene* set = new Scene(5); 
set->addpicture("in_01.bmp", 0, 0, 0); 
+0

請你修復代碼縮進? – 2010-02-09 01:44:05

+0

哪條線路崩潰? – 2010-02-09 01:46:19

+1

刪除前無需檢查空值。另外,爲什麼不把'Image * extra'與下面的行結合起來? – GManNickG 2010-02-09 01:46:20

回答

0

這代碼看起來不錯,我認爲錯誤在程序的其他部分。也許imagelist數組未初始化爲NULL?或maxnum不是imagelist的實際尺寸。或者其他的東西。

什麼是失敗 - 你有追溯?

+0

我對C++相當陌生,但我將它縮小爲它的刪除命令。 – 2010-02-09 01:48:51

+0

然後指針無效。你必須跟蹤一切,看看它出錯的地方。 – GManNickG 2010-02-09 01:55:32

+0

我看到兩個最有可能的原因 - 數組未初始化(數組中的所有指針未設置爲「NULL」),或者當對象被刪除時(在程序的其他部分中),指針未設置爲NULL。 – Messa 2010-02-09 02:04:13

1

SEGFAULT意味着您正在嘗試訪問您應該訪問的位置以外的位置。在你對Messa的評論中,你說它發生在delete命令中。

於是,我問你:當你構建Scene類,你明確初始化指針在imagelist爲NULL?換句話說,有沒有像線:

for (i=0; i<maxnum; i++) { 
    imagelist[i] = NULL; 
} 
在構造函數

,或者你假設未初始化數組開始爲0填充? (與大多數語言不同,這個假設在C++中是不好的。)

+1

這是我們應該使用'std :: vector'代替的原因。 – GManNickG 2010-02-09 02:01:18

+0

是的,我剛剛上傳了我的默認構造函數,它似乎就是這麼做的。還有什麼地方會出錯?我已經包含了在main方法中運行的語句以及我的構造函數和addpicture方法。 – 2010-02-09 02:06:14

+1

你是否知道你有一組圖像數組?這可能是一個錯誤,所以請嘗試'Image *'而不是'Image **'。 或者,使用C++方式並使用'std :: vector'。 – Messa 2010-02-09 08:19:32

4

在你的構造函數中你有一個本地圖像列表,但是你在addpicture中使用了一個字段imagelist。您在構造函數中映射imagelist字段並且該字段永遠不會被初始化。

修復它通過更換這行:

Image** imagelist = new Image*[max]; 

有了這個:

imagelist = new Image*[max];