繁体   English   中英

如果我不使用“new”关键字,为什么会出现分段错误?

[英]Why do I get segmentation fault if I don't use “new” keyword?

以下代码生成分段错误。 如果我在我的 node1 的堆上分配 memory,我不会遇到分段错误。 Node* node1 = new Node )。 我的问题是为什么我现在会出现分段错误? 不应该Node* node1; 在堆栈上为我的 node1 获取 memory 行吗?

class Node{
    public:
        int data;
        Node* next;
};

int main(){
    Node* node1;
    node1->data = 5;

    cout << node1->data << endl;
}

我打印了 node1 的地址并添加了一条 cout 行:

int main(){
    Node* node1;
    cout << &node1 << endl;
    node1->data = 5;

    cout << node1->data << endl;
}

现在错误消失了。 每当我评论 cout 行时,错误就会回来。 谁能解释这种行为?

不应该Node* node1; 在堆栈上为我的node1获取 memory 行吗?

Node* node1; 在指针node1的堆栈上获取 memory 。 但是,在那之后,指针node1未初始化并且没有指向任何有效的地方。 这就是为什么您需要在更改它指向的数据之前使其指向某个有效的地方,而这样做的一种方法是使用new

问题:为什么我现在会出现分段错误?

答:每当我们访问程序段外的 memory 时,就会出现分段错误。

问题:不应该 Node* node1; 在堆栈上为我的 node1 获取 memory 行吗?

答:1.在Node * node1; node1 只是指向节点 object 的指针类型变量。 node1 指针大小不依赖于 Node 结构的成员。 它在 32 位操作系统/平台中只有 4 个字节长。 此指针变量应仅用于存储指针类型的地址,此处为Node

  1. 目前其持有垃圾价值。

  2. 我们必须创建类型为 Node 的 object(分配内存),或者使用"Node *node1 = new Node; ”或在本地(非动态)作为“ Node node1; ”,现在我们可以使用 ->(指向member) 运算符或 using. (dot) 运算符。

问题:我打印了 node1 的地址添加了一条 cout 行?

答:您打印的不是节点 object 的指针变量地址。

问题:每当我评论 cout 行时,错误就会回来。 谁能解释这种行为?

答:1. 行为将是不可预测的,因为您正在使用垃圾地址(存在于 node1 指针变量中)。

  1. 如果指针变量(垃圾)指向受其他进程保护/使用的 memory,那么我们将遇到分段错误。

  2. 如果垃圾地址指向 memory 尚未被其他进程使用/保护,我们可能不会收到任何错误。

我希望它现在清楚了。 如果有任何后续问题,请告诉我。

为了使用 object,构造函数必须存在并在实例化 object 时使用。 如果您不提供任何构造函数,则编译器可以在某些条件下隐式定义构造函数,但最终,如果您希望实例化 object,则构造函数必须存在。

暂无
暂无

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

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