Ошибка C ++: завершить вызов после выброса экземпляра 'std :: bad_alloc' - PullRequest
0 голосов
/ 06 июля 2019

Я создал пользовательский класс String и некоторую функцию обработки файлов. Я пытался использовать g ++ в Ubuntu для компиляции этого куска кода и GDB для отладки несколько раз прежде. Ошибка была выдана в строке

s2.diskIn(iflile);

Интерфейс:

class String {
    long unsigned int len; 
    char *cStr;
public:
    String(const String &);
    explicit String(const char * const = NULL);

    void diskIn(std::ifstream &);
    void diskOut(std::ofstream &);
    const char *getString();
    String operator = (const String);
    ~String();
};

Конструктор копирования

String::String(const String &ss) {
    if (ss.cStr == NULL) {
        cStr = NULL; len = 0;
    } else {
        len = ss.len;
        cStr = new char[len + 1];
        strcpy(cStr, ss.cStr);
    }
}

Конструктор по умолчанию / присваивания

String::String(const char * const p) {
    if (p == NULL) {
        cStr = NULL; len = 0;
    } else {
        len = strlen(p);
        cStr = new char[len + 1];
        strcpy(cStr, p);
    }
}

Функция ошибки:

void String::diskIn(std::ifstream &fin) {
    String temp;
    fin.read((char *)&temp.len, sizeof(int));
    temp.cStr = new char[len + 1];
    int i;
    for (i = 0; i < temp.len; i++) 
        fin.get(temp.cStr[i]);
    temp.cStr[i] = '\0';
    *this = temp;   
}

Оператор назначения копирования

String String::operator = (const String ss) {
    if (cStr != NULL) {
        delete[] cStr;
        cStr = NULL;
        len = 0;
    }

    if (ss.cStr != 0) {
        len = ss.len;
        cStr = new char[len + 1];
        strcpy(cStr, ss.cStr);
    }
    return *this;
}

Destructor

String::~String() {
    delete[] cStr;
}
int main() {
    String s2;
    std::ifstream ifile("document.txt");

    s2.diskIn(ifile); //Error was thrown here
    std::cout << s2.getString() << "\n";
    ifile.close();

    return EXIT_SUCCESS;
}
...