为什么在使用指针 (C++) 时出现未初始化的堆内存错误

Why am I getting an uninitalized heap memory error when using a pointer (C++)?

本文关键字:初始化 错误 内存 指针 C++ 为什么      更新时间:2023-10-16

我的任务是用C/C++编写一个更简单的编译器。main() 函数调用下面的函数 parse_program() 以从控制台读取所有输入并将其存储在链表图中。

出于某种原因,我的程序在这里中断:

while (node != NULL){
    if (node->id == ID) //Breaks here
        ...; 
    node = node->next;
}

在0xCDCDCDCD时内存访问冲突。对此的研究表明,我有未初始化的堆内存。做了一些实验,我意识到在创建节点后立即,node->next 在位置 0xCDCDCDCD。

struct Node* parse_program(){
    struct Node* node = new Node;
    cout << node;
    cout << node->next;
    ...;
    return node;
}

输出

0044A940 
CDCDCDCD

上面的函数是程序中调用的第一件事。我确实有全局变量。

我是否为节点分配了不正确的内存?即使在调用所述数组/指针之前,程序中的单元化数组/指针或其他地方的内容也会导致错误吗?

感谢您的任何建议。我不知道从哪里开始寻找问题。

以下是我知道如何解决它的选项:

  • 您可以在node = new Node;后立即手动设置node->next = NULL;;
  • 如果 paren 没有任何用户提供的构造函数(Node例如new Node() struct Node { Node *next; }; ) 在此处查看有关值初始化的更多详细信息:http://en.cppreference.com/w/cpp/language/value_initialization
  • 您可能希望将默认构造函数添加到 Node,以使next初始化自动进行。

以下是添加构造函数的方法:

struct Node {
  Node() : next(NULL) {}
  Node *next;
  ...
};

new Node将调用默认构造函数 Node() ,这会将next数据成员设置为NULL

如果省略构造函数,C++将使用隐式Node() {}new Node 一起使用,这使next保持未初始化(并且其值未定义),因此当您打印它时,您会得到随机垃圾。