gpt4 book ai didi

c++ - 尝试访问指向节点的指针时出现段错误

转载 作者:行者123 更新时间:2023-12-02 09:57:44 25 4
gpt4 key购买 nike

我正在尝试在 Node 结构中启动一个元素,但是每当我尝试访问它时,我都会遇到段错误。我已经在 Stack 类中初始化了 Node,但无法在其上插入元素。
堆栈.h

#ifndef QUEUE_H
#define QUEUE_H

struct Node;

// Pilha de números inteiros.
class Stack {
public:
// Representa uma exceção que ocorre quando a pilha está vazia.
class EmptyException {};

// Constrói uma pilha vazia.
Stack();

// Insere um elemento no topo da pilha.
void push(unsigned elem);

// Retorna o elemento no topo da pilha.
// Lança EmptyException caso a pilha esteja vazia.
unsigned top() const;

// Remove o elemento no topo da pilha.
// Lança EmptyException caso a pilha esteja vazia.
void pop();

// Retorna o número de elementos na pilha.
unsigned count() const;
private:
Node* _top{};
unsigned _count;
};

#endif
Stack.cpp - 段错误发生在第 10 行
#include "Stack.h"

struct Node {
unsigned elem{};
Node * next{};
};

Stack::Stack() {
this->_count = 0;
this->_top->elem = 0; // This is where the segmentation fault is occurring
}

void Stack::push(unsigned elem) {
this->_top->elem = elem;
this->_count++;
}

void Stack::pop() {
// TODO.
}

unsigned Stack::top() const {
return 0;
}

unsigned Stack::count() const {
return 0; // TODO.
}
Screenshot of lines of code and variables

最佳答案

在您的 Stack类的构造函数,您正在使用(取消引用)top_在初始化为任何有意义的东西之前的成员指针。由于它的值可能是某种垃圾,因此您试图访问未为您的进程设置的虚拟内存段中的地址;因此你得到一个“段错误”。
怎么做才能避免这种情况?

  • 在启用警告的情况下编译代码。然后编译器会告诉您未初始化值的使用。有关为何应启用警告的更多信息,请阅读此 SO 问题:Why should I always enable compiler warnings?
  • 在初始化列表中初始化您的类(class)成员,最好按顺序进行。有关为什么应该使用初始化列表的讨论,请阅读这个 SO 问题:Why should I prefer to use member initialization lists?
  • 在您的特定类中 - 当堆栈的顶部元素可能不存在时,不要尝试在堆栈的顶部元素上设置值。即 top_ 的正确初始化是nullptr - 你仍然会在试图取消引用它时崩溃。

  • 您可能还想考虑(这些不是建议,只是想法):
  • 使用 std::unique_ptr 's 而不是原始指针。这会给你异常(exception)而不是硬崩溃,而且你永远不会错误地泄漏内存。
  • 对堆栈使用非列表式结构(例如,更像 std::vector 的东西)。由于除了弹出之外您不会迭代堆栈的内容,因此您不必担心迭代器在重新分配时失效。
  • 使用 std::stack (除非这是一个编程练习,在这种情况下没关系)。
  • 关于c++ - 尝试访问指向节点的指针时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64405396/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com