2012-12-19 41 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