为什么在使用指针 (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时内存访问冲突。对此的研究表明,我有未初始化的堆内存。做了一些实验,我意识到在创建节点后立即,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
保持未初始化(并且其值未定义),因此当您打印它时,您会得到随机垃圾。
相关文章:
- 使用默认构造函数引用成员变量初始化错误
- 交换机案例语句中的初始化错误
- 英特尔 MKL 稀疏 QR 求解 C++ 返回未初始化错误
- 在模板类中使用"this"会导致参数初始化错误
- 映射的映射集的映射初始化错误
- C++图形初始化错误(语法或丢失文件缺陷?
- QSQLDATABASE:SIGSEV初始化错误
- 映射的 std::for_each() 给出无效的初始化错误
- 初始化错误过多
- C++初始化错误 std::set
- 简单的类构造函数初始化错误
- 组合框初始化错误:无法读取未定义的属性'constructor'
- OpenCV卡尔曼滤波器初始化错误
- C++11动态数组部分列表初始化(错误或误解)
- C++ 静态变量在发布模式下初始化错误
- Visual Studio 2010 SP1 中的 64 位整数初始化错误
- C++libPNG-简单初始化错误
- 结构数组-初始化错误
- 初始化错误
- 我不断收到函数初始化错误.(运行时检查失败 #3)