繁体   English   中英

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

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

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

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

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

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

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

    ...;
    return node;
}

产出

0044A940 
CDCDCDCD

上面的函数是程序中首先要调用的函数。 我确实有全局变量。

我是否为节点分配了错误的内存? 甚至在调用该数组/指针之前,统一的数组/指针或程序中其他内容是否会引起错误?

感谢您的任何建议。 我很困惑从哪里开始寻找问题。

以下是我知道如何修复的选项:

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

这是添加构造函数的方法:

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

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

如果省略构造函数,则C ++将对new Node使用隐式的Node() {} ,这会使next未初始化(并且其值未定义),因此在打印时会出现随机垃圾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM