读取访问冲突 0xCDCDCDCD
Posted
技术标签:
【中文标题】读取访问冲突 0xCDCDCDCD【英文标题】:Read access violation 0xCDCDCDCD 【发布时间】:2017-07-20 05:09:56 【问题描述】:我不断收到读取访问冲突。这是我的代码。
class List
public:
List();
List(const List ©);
~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();
【问题讨论】:
请添加语言标签 你写mEnd->getnext()
,但 mEnd
可能为空
更改您的代码,以免在空指针上执行->
while (mEnd->getnext()!= nullptr)
-> while (mEnd)
如果每个链表实现问题我都有一分钱!!!
【参考方案1】:
Microsoft C++ 调试库使用常量0xCD
来填充分配的堆块。因此,当您从尚未由您的代码初始化的动态堆对象中读取数据时,您可以看到模式 0xCDCDCDCD
。
您没有显示Record
类定义,但我猜您的Record::Record
构造函数未能将next
指针设置为nullptr
。当迭代到达列表的末尾时,您使用getnext()
获取那个神奇的0xCDCDCDCD
值。这是一个无效的指针,因此您无法通过下一次 getnext()
调用访问 0xCDCDCDCD
处的内存。
来源:
Magic number (programming) *** Win32 Debug CRT Heap Internals Andrew Birkett 在他的 www.nobugs.org 上 Magic Numbers in Visual C++(2009 年 8 月)在 Adam Sawicki 的 asawicki.info 上【讨论】:
【参考方案2】:这是一种猜测:
您为循环调用while(mEnd->getnext() ...)
然后在循环体中再次调用mEnd->getnext()
,这不会提供相同的结果; IE。它可能已经结束了。
【讨论】:
以上是关于读取访问冲突 0xCDCDCDCD的主要内容,如果未能解决你的问题,请参考以下文章