创建动态字符串数组时出现Seg Fault

时间:2013-04-20 02:12:08

标签: c++ segmentation-fault

我的朋友正在写一个基于文本的游戏,并让我看看这个崩溃的代码。我调试它,并在创建动态数组时遇到seg错误。我不确定为什么,我建议他完全避免使用指针并使用矢量,这样可以解决他的问题,但我很好奇这里到底出了什么问题。这是他的代码:

#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;
}

1 个答案:

答案 0 :(得分:1)

您正在呼叫tellg

listLength = fileName.tellg();

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

namePartList = new string[listLength]

可能是一个不受欢迎的价值。我很确定它会返回-1,因为allocating a zero sized应该没问题。

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