Перегрузка C ++ >> для освобожденного указателя ifstream на mac не был выделен - PullRequest
2 голосов
/ 24 февраля 2010

Я пытаюсь следующий код, и он завершается с ошибкой:

malloc: *** error for object 0x10000d8c0: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Program received signal:  “SIGABRT”.

Вот содержимое файла input.txt: он имеет полные права доступа и файл успешно открыт в отладчике. Пожалуйста, помогите.

Jacob Anderson
Michael Thomson
Joshua Smith
Mathew Matheis
Ethan Evans 
Emily Drake
Emma Patterson
Madison McPhee
Hannah Briens
Ashley Schmidt

.

#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
#include <list>
#include <fstream>
#include <string>

#include <stdio.h>

using namespace std;

struct DataType  {
    string lastname;              // (Key) Student's Last Name
    string firstname;     // Student's First Name

    string getKey () const
    { return lastname; }   // Returns the key field
};

ostream& operator << (ostream& os, DataType myData) {
    os<<myData.firstname<< " "<<myData.lastname;
    return os;
}

bool operator < (DataType lhs, DataType rhs) {
    if (lhs.firstname < rhs.firstname)
        return true;
    return false;
}

int main() {
 ifstream studentFile ("input.txt");  // Student file
    list <DataType> students;            // Students
    DataType currStudent;              // One Student (has firstname,lastname)

    if (! studentFile.is_open())
    {
        return -1;
    }
    while (studentFile >> currStudent.firstname >> currStudent.lastname) {
        students.push_back(currStudent);
    }

    list<DataType>::iterator i = students.begin();
    while (i != students.end()) {
        cout << *i << endl ;
        ++i;
    }    
}

Ответы [ 2 ]

1 голос
/ 24 февраля 2010

Я не вижу ничего явно неправильного в коде. Там происходит некоторое ненужное копирование (различные операторы должны брать DataType & (на самом деле, предпочтительно const DataType &), а не объекты, как они делают сейчас, чтобы предотвратить копирование объектов. Я бы также удалил включение stdio.h как вам не нужно это для кода, который вы показываете здесь.

Ничто из вышеперечисленного не должно вызывать ошибку, которую вы видите. Есть ли другой код, который вы нам не показываете?

0 голосов
/ 24 февраля 2010

Код выглядит хорошо для меня - я бы сказал, что проблема в другом месте (возможно, проблема с установкой?) У вас есть некоторые кусочки, которые не совсем хороши, но ничего, что должно вызывать серьезную проблему (например, DataType::getKey никогда не используется, operator<(DataType, DataType) никогда не используется, operator<<, вероятно, должно принимать константную ссылку вместо значения).

...