【问题标题】:Segmentation Fault with declared variables C++ [closed]声明变量C ++的分段错误[关闭]
【发布时间】:2021-10-18 21:23:56
【问题描述】:

我正在尝试创建一个节点类。节点类有两个变量:一个 int 和一个指向另一个节点的指针。这是我的节点构造函数。我在另一个堆栈溢出中发现,为了为值分配内存,您需要包含一个“new ...”短语。

Node::Node() {
    next = new Node;
}

Node::Node(int new_num) {
    num = new_num;
    next = new Node;
}

我正在使用一个名为 AssignArray 的方法,它接受一个整数数组并将其转换为节点的链接列表。它的一部分工作,除非我尝试在我的节点上使用 setNext 方法。 setNext 方法只是一个常规的 setter。

void Node::setNext(Node* new_next) {
    next = new_next;
}

Node* Node::AssignArray(int list[], int i, int size) {
    if (i == size) {
        return NULL;
    }
    else {
        Node new_node(list[i]);
        i++;
        new_node.setNext(new_node.AssignArray(list, i , size));
        return &new_node;
    }

}

到目前为止,这是我的主要功能:

int main() {

    int nums1[] = {1,2,3,4,5};
    int nums2[] = {1,3,5,7,9};
    
    Node node1 = Node();
    int nums1_size = sizeof(nums1)/sizeof(nums1[0]);
    node1.AssignArray(nums1, 0, nums1_size);
    

【问题讨论】:

  • 当你创建一个节点时,你的构造函数会创建另一个节点,导致创建节点的无限循环。
  • return &new_node 返回一个指向本地对象的指针。当函数返回时,该对象不再存在,因此函数总是返回一个无效的指针。
  • "包含一个“新...”短语"是过时的建议。如果您需要动态创建对象,请参阅std::make_uniquenew 在 C++ 中几乎没有合法用途。

标签: c++ pointers segmentation-fault


【解决方案1】:

主要问题是您使用来自AssignArray 的返回值调用setNext,您将其返回为&new_node,这是一个指向您在堆栈上分配的本地Node 的指针。一旦函数返回,堆栈就会展开,Node 实例不再存在,指针悬空。

至少你应该这样做:

Node* new_node = new Node(list[i]);
...
return new_node;

但我也觉得我们在这里遗漏了一些东西。很高兴看到Node 的定义。这个构造函数怎么不产生堆栈溢出?

Node::Node() {
    next = new Node;
}

在构造函数中,您执行new Node,这将再次调用相同的构造函数...这将再次调用构造函数...

嗯。

【讨论】:

    【解决方案2】:

    我认为在无限循环自身时在构造函数上添加了新节点。

    Node::Node() {
    next = new Node;
    

    }

    最好避免这种类型的调用。

    【讨论】:

      猜你喜欢
      • 2011-05-31
      • 2019-01-07
      • 1970-01-01
      • 2014-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      相关资源
      最近更新 更多