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();

何も読み取らずに、ファイルが正常に開いたかどうかに応じて or が返さ0れる-1ため、次のように呼び出されます。

namePartList = new string[listLength]

おそらく望ましくない値です。サイズがゼロの割り当ては問題ないはずなので-1、戻ってくると確信しています。

これはコードの後半にも当てはまりますstd::vector

于 2013-04-20T02:23:19.610 に答える