读取访问冲突 0xCDCDCDCD

Posted

技术标签:

【中文标题】读取访问冲突 0xCDCDCDCD【英文标题】:Read access violation 0xCDCDCDCD 【发布时间】:2017-07-20 05:09:56 【问题描述】:

我不断收到读取访问冲突。这是我的代码。

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();

【问题讨论】:

请添加语言标签 你写 mEnd-&gt;getnext() ,但 mEnd 可能为空 更改您的代码,以免在空指针上执行-&gt; while (mEnd-&gt;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-&gt;getnext() ...) 然后在循环体中再次调用mEnd-&gt;getnext(),这不会提供相同的结果; IE。它可能已经结束了。

【讨论】:

以上是关于读取访问冲突 0xCDCDCDCD的主要内容,如果未能解决你的问题,请参考以下文章

选择PixelFormat 访问冲突读取位置

访问dll方法时访问冲突读取位置

套接字窗口例外。读取访问冲突

奇数访问冲突读取错误/glDrawArrays 使用

我在删除指针时遇到读取访问冲突[关闭]

glDrawPixels 访问冲突读取位置