未初始化的对象?这段代码有什么问题。

时间:2014-05-09 07:20:37

标签: c++ object initialization

由于某种原因,代码崩溃并给我一个访问冲突错误。它一直说对象用户未初始化

  

随机编码中0x0F45E89A(msvcr110d.dll)的第一次机会异常   在C ++。exe:0xC0000005:访问冲突写入位置   在Random的0x0F45E89A(msvcr110d.dll)处的0xABABABAB.Unhandled异常   在C ++中编码.exe:0xC0000005:访问冲突写入位置   0xABABABAB。

感谢。有什么想法吗?

#include <iostream>
#include <fstream>
#include <cstring>
#include <sstream>
#include <vector>
#include <string>

using namespace std;

struct User { 
    string name; //Both first and last name go here 
    int birthYear; 
    string major; 
}; 

int main()
{
    ifstream input("input.txt");

    if(!input || !input.is_open())
        return -1;

    string buffer;
    int count = -1;
    int index = 0;
    int size;
    User* users;

    while(getline(input, buffer, '\n'))
    {
        stringstream ss(buffer);

        if(count == -1)
        {
            ss >> size;
            users = new User[size];
            count = 0;
        }
        else
        {
            if(count == 0)
            {
                users[index].name = buffer;
                count++;
            }
            if(count == 1)
            {
                ss >> users[index].birthYear;
                count++;
            }
            if(count == 2)
            {
                users[index].major = buffer;
                count = 0;
                index++;
            }
        }
    }

    for(int i = 0; i < 2; i++)
    {
        cout<<users[i].name << " " << users[i].birthYear << " " << users[i].major <<endl;
    }
    system ("PAUSE");
    return 0;
}

2 个答案:

答案 0 :(得分:1)

for(int i = 0; i < 2; i++)
{
    cout<<users[i].name << " " << users[i].birthYear << " " << users[i].major <<endl;
}

看起来没有结果。你如何确定用户包含至少两个元素。如果getline因badfile而失败,或者第一行只建议1条记录,则会超出异常。

您应该将循环更改为

// Initialize size with 0 before while(getline) loop
for(int i = 0; i < size; i++)
{
    cout<<users[i].name << " " << users[i].birthYear << " " << users[i].major <<endl;
}

下面的代码行看起来有问题

if(count == 0)
{
    users[index].name = buffer;
    count++;
}
if(count == 1)
{
    ss >> users[index].birthYear;
    count++;
}
if(count == 2)
{
    users[index].major = buffer;
    count = 0;
    index++;
}

当count为0时,它将进入第一个if条件并且增加。然后条件count == 1将变为真,您也将访问接下来的2个条件。您应该使用if替换下2个else if条件或使用switch语句替换break以查看intended behavior

完成后,释放用户也是一种好习惯。

答案 1 :(得分:0)

我认为第一个getline失败(while没有输入,因此没有创建任何内容)并且您自动到达for循环。检查您确实拥有用户。