2012-12-19 57 views
2

我有五個文件:類T,類M(抽象類),類MC(容器),類AC(創建一個添加到MC容器中的特定對象)和我的主文件。 我有這些函數來添加一個對象(對於這種情況下,AC),並檢索您在AC(標題)中找到的數據成員。處理未初始化的指針數組的錯誤C++

該程序編譯,看來我可以創建和添加一個AC對象。然而,當我嘗試使用我的getTitle功能,程序崩潰,我得到以下錯誤

「未處理的異常在0x00b938e6在TLAB 5.exe:0000005:訪問 衝突讀取位置0xcccccce4。」

從我擡頭看,這意味着我有一個壞/未初始化的指針。在我的程序的唯一指針是:

M *C[MCSize] //Found in MC.h 

爲MC的構造是這樣的:

MC::MC() 
{ 
cout << "Enter Name: "; 
getline(cin, CName); 

cout << "Enter size of collection: "; 
cin >> CurrentMCSize; 
if (CurrentMCSize < 0 || CurrentMCSize > MCSize) 
{ 
    cout << "Size is invalid. Please re-enter: "; 
    cin >> CurrentMCSize; 

}; //MCSize is defined in the header of MC. 

調用時輸入的標題的功能是在這裏:

void MC::ListMTitles() 
{ 
     for (int i = 0; i < CurrentMCSize; i++) 
     { 
     cout << i << ". " << Collection[i]->GetTitle(); 
     } 
}; 
//GetTitle is defined in M.cpp 

在發生DMA的情況下://MC.cpp

void MC::AddM() 
{ 
int Selection; 
if(CurrentMCSize < MCSize) 
{ 
    DisplayMTypeMenu(); 
    Selection = GetMTypeSelection(); 
    switch(Selection) 
    { 
    case 1: Collection[CurrentMCSize] = new AC; 
    break; 
    // Other case statements 

    } 
    if (0 == Collection[CurrentMCSize]) 
    { 
     cout << "Error: Memory Allocation Failed."; 
     exit(1); 
    } 
    else 
    { 
     cout << "New M Type added!" << endl << endl; 
    } 
    CurrentMCSize++; 
} 

我沒有正確初始化我的指針嗎?我的添加功能實際上是對我說謊而沒有添加任何東西?我環顧四周,但是我看到的大部分答案都涉及到使用矢量,爲了這個項目,我認爲我不允許使用這個項目,因爲教授沒有理解它們。

+0

所以它是C++而不是C,對不對? – 2012-12-19 18:33:44

+0

事故發生在哪裏? –

+0

你從0列出'CurrentMCSize',我相信你還沒有創建這些。 – imreal

回答

2

您正在要求用戶在施工期間輸入集合的大小,但是您絕不會填充集合中的這些元素。然後,當您撥打AddM時,它會繼續從CurrentMCSize。您應該在構造函數中將CurrentMCSize初始化爲零,並且根本不要求它。

1

的問題時,因爲這

for (int i = 0; i < CurrentMCSize; i++) 
    { 
    cout << i << ". " << Collection[i]->GetTitle(); 
    } 

從0開始,但沒有保證ADDM()將開始在0添加:

void MC::AddM() 
{ 
int Selection; 
if(CurrentMCSize < MCSize) 
{ 
    DisplayMTypeMenu(); 
    Selection = GetMTypeSelection(); 
    switch(Selection) 
    { 
    case 1: Collection[CurrentMCSize] = new AC; 

相反,它會增加在任何CurrentMCSize是可以按照類似於4的方式輸入到構造函數中。您需要跟蹤三個單獨的值:支持的最大大小,當前使用的大小以及分配項目的下一個插槽,但是已將最後兩個摺疊爲一個變量。

相關問題 - 你不想簡單地使用std :: vector和push_back?

編輯:啊,我沒有看到它,帕迪擊敗了我。

+0

@瑞安馬洛尼和帕迪 謝謝!這有助於解決它!我沒有意識到這個錯誤。 至於不使用std :: vector,就像我剛纔提到的那樣,我們的教授沒有談論它,我還沒有學到很多東西。 – Rowahood