读取访问冲突0xCDCDCDCD

时间:2017-07-20 05:09:56

标签: c++ pointers

我一直收到读访问权限。这是我的代码。

class List
{
public:
    List();
    List(const List &copy);
    ~List();

    /*List & operator=(const List &rhs);


    Record * headPtr() const;
    void setheadptr(Record * const newhead);

    bool insertatfront(Record newdata);*/


    void importcourselist();
    void Loadmasterlist();
    void storemasterlist();

    Record *makenode(fstream &file);
    Record *makenode(ifstream &file);

private:
    Record *mHead;
    Record *mEnd;

};
List::List()
{
    mHead = nullptr;
    mEnd = nullptr;

}

void List::storemasterlist()
{
    ofstream outfile;
    outfile.open("masterlist.txt");

    mEnd = mHead;
    while (mEnd->getnext()!= nullptr)
    {
        outfile << mEnd << endl;
        mEnd = mEnd->getnext();

    }
    outfile << mEnd;
}

我不确定发生了什么但是,每次我尝试调试它时,它都会将我发送到指针的getter函数,如下所示:

 Record *Record::getnext()
    {
        return mnext;
    }

我相信我的错误在于我的导入功能。这是我正在创建额外的空节点。

void List::importcourselist()
{
    ifstream infile;
    string ptoken;
    infile.open("studentlist.csv");

    getline(infile, ptoken);

    mHead = makenode(infile);

    mEnd = mHead;



    while (!infile.eof())
    {
        mEnd->setnext(makenode(infile));
        mEnd = mEnd->getnext();
    }

    infile.close();
}

2 个答案:

答案 0 :(得分:4)

Microsoft C ++调试库使用常量0xCD来填充已分配的堆块。因此,当您从未被代码初始化的动态堆对象中读取数据时,您可以看到模式0xCDCDCDCD

您没有显示Record类定义,但我猜您的Record::Record构造函数未能将next指针设置为nullptr。当迭代到达列表末尾时,您可以使用0xCDCDCDCD获取该魔术getnext()值。这是一个无效指针,因此您无法通过下一次0xCDCDCDCD调用getnext()访问内存。

来源:

答案 1 :(得分:0)

这是一种猜测:

  • 您为循环
  • 致电while(mEnd->getnext() ...)
  • 然后在循环体中再次调用mEnd->getnext(),其中不会传递相同的结果;即它可能已经结束了。