bad_alloc C ++使用带有char指针的std :: string构造函数

时间:2018-05-15 21:08:01

标签: c++ string out-of-memory bad-alloc

我正在用C ++(11)创建一个简单的程序。

我的问题是名为" loadRoomsFile()"正在将文本从文件读取到char指针数组,然后将其返回。

我想将它转换为字符串,所以我使用了字符串构造函数,参数为* char array。

所有测试都显示,缓冲区也显示正确的数据但是在调用string(loadRoomsFile())时,我得到bad_alloc异常并且程序停止运行。任何人都可以帮助我吗?

char *loadRoomsFile() {

fstream roomsFile;
char *buffer;

// helper
int i = 0;

cout << "TEST 1" << endl;

roomsFile.open("rooms.txt");

cout << "TEST 2" << endl;

if(roomsFile.is_open()) {

    cout << "TEST 3" << endl;
    roomsFile.seekg(0, ios::end);
    cout << "TEST 4" << endl;
    buffer = new char[roomsFile.tellg()];
    cout << "TEST 5" << endl;
    roomsFile.seekg(0, ios::beg);
    cout << "TEST 6" << endl;
    while(!roomsFile.eof()) {

        cout << "TEST WHILE" << endl;
        buffer[i] = roomsFile.get();
        i++;
    }
    cout << "TEST 7" << endl;
}

roomsFile.close();
cout << "TEST 8" << endl;

buffer[i] = '\0';
cout << "TEST 9" << endl;
cout << buffer << endl;

return buffer;
}


/*
 * GENERAL FUNCTION
*/

int main() {

// Variables
int currentSection; // option choosed in Main Menu
int revert = true; // used for going back in time XD
//string roomsData; // used for storage of data from file
vector<Room> rooms;

cout << "----------------------------------------------------------------" << endl;
cout << "Conference Room Manager ver. 0.1" << endl;
cout << "Component 1/4, Bartosz Kubacki/Bartlomiej Urbanek" << endl;
cout << "----------------------------------------------------------------" << endl;

cout << endl;

// load all data from files
cout << "TEST MAIN" << endl;
string roomsData(loadRoomsFile());

return 0;
}

谢谢!

1 个答案:

答案 0 :(得分:2)

首先:您应该提供Minimal, Complete and Verifiable example,而不是让我们必须更正您的代码甚至构建它。这并不尊重我们的努力。

第二:你分配的文件大小与文件大小一样多,但是你写了&#39; \ 0&#39;在最后一次之后1.这似乎是触发段错误的具体问题。

但实际上,主要问题在于您的方法:

  • 除非绝对必要,否则不应自行分配记忆。
  • 你不应该把整个文件的内容读成一个字符串(除非你知道它真的很短)。
  • 您不应该一次从文件中读取一个字符。要么与std::getline()逐行阅读;或使用管道运算符解析数据(如cin >> my_float);或立即阅读整个文件;或mmap()文件(不是C ++功能,但Linux,Windows,MacOS和其他支持)。