0

我的朋友正在编写一个基于文本的游戏,并要求我查看这个崩溃的代码。我对其进行了调试,并且在创建动态数组时出现了段错误。我不确定为什么,我建议他完全避免使用指针并使用向量,希望这能解决他的问题,但我很好奇这里到底出了什么问题。这是他的代码:

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <ctime>

using namespace std;

class nation
{
    public:
    void init();
    string genName();
    string getName();

    private:
    string myName;
    int* myBorderPoints;
};

string nation::getName()
{
    return myName;
}

string nation::genName()
{
    int listLength = 0, listPos = 0, listRand = 0;
    string nameToGen = "";
    string* namePartList;
    ifstream fileName;
    fileName.open("NamePart1.txt");
    listLength = fileName.tellg();
    namePartList = new string[listLength]; // Seg fault here
    while (fileName.good())
    {
        while (!fileName.eof())
        {
            getline(fileName,namePartList[listPos]);
            listPos += 1;
        }
    }
    listRand = rand() % listLength;
    nameToGen += namePartList[listRand];
    fileName.close();
    listLength = 0;
    listPos = 0;
    listRand = 0;
    nameToGen = "";
    fileName.open("NamePart2.txt");
    listLength = fileName.tellg();
    namePartList = new string[listLength];
    while (fileName.good())
    {
        while (!fileName.eof())
        {
            getline(fileName,namePartList[listPos]);
            listPos += 1;
        }
    }
    listRand = rand() % listLength;
    nameToGen += namePartList[listRand];
    fileName.close();
    return nameToGen;
}

void nation::init()
{
    srand(time(NULL));
    myName = genName();
}

int main()
{
    nation testNation;
    testNation.init();
    cout << testNation.getName();
    return 0;
}
4

1 回答 1

1

你在打电话tellg

listLength = fileName.tellg();

没有读取任何内容,这取决于文件是否成功打开将返回0-1因此您将调用它:

namePartList = new string[listLength]

可能是一个不受欢迎的值。我很确定它会返回-1,因为分配零大小应该没问题。

这也适用于稍后的代码,std::vector可能更有意义。

于 2013-04-20T02:23:19.610 回答