C ++重载>>因为没有分配被释放的mac指针上的ifstream

时间:2010-02-24 05:59:03

标签: c++ ifstream

我正在尝试以下代码,但它失败并出现以下错误:

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 个答案:

答案 0 :(得分:1)

我看不出任何明显错误的代码。正在进行一些不必要的复制(各种运算符应该采用DataType &(实际上,最好是const DataType &)而不是现在的对象,以防止复制对象。我还将删除包含stdio.h,因为你在这里显示的代码不需要它。

但是,以上都不会触发您所看到的错误。你还没有向我们展示其他任何代码吗?

答案 1 :(得分:0)

代码看起来对我好 - 我说这个问题来自其他地方(可能是安装问题?)你确实有一些不太好的部分,但没有什么可能导致重大问题(例如从不使用DataType::getKey,从不使用operator<(DataType, DataType)operator<<应该使用const引用而不是值。)