【问题标题】:Segmentation Fault (Core Dumped) When overriding operator<< for stack覆盖操作符<<堆栈时出现分段错误(核心转储)
【发布时间】:2015-02-07 03:32:01
【问题描述】:

我正在尝试为我的堆栈类覆盖运算符

  ostream& operator << (ostream &out, Stack &stack){
        int a = stack.getStackCount();
        string outString = "";
        PlateNode temp = PlateNode(stack.getTop().getPlate());
        for(int i =0;i<a;i++){
                outString = outString + ", " + temp.getPlate().getName();
                temp = temp.getNextNode();
        }
        out << outString;
        return out;
}

那是我试图覆盖操作符的地方,我的主要是:

int main()
{
    Stack nullStack = Stack();
    nullStack.push(pNode);
    nullStack.push("me");
    cout <<"Reached c"<<endl;
    cout<<nullStack;
}

在输入 main 中的最后一行之前,该错误不存在。 请帮忙!

编辑:如果有帮助,这是我的全部代码,抱歉没有完整评论:

https://docs.google.com/document/d/16pg01muz0S5IMlXBahdL-JyVE5y7buzOVHYEOn_jyvE/edit?usp=sharing

【问题讨论】:

  • 如果程序崩溃可能是由于您的Stack 类。
  • 你的栈类的定义是什么?我怀疑PlateNode temp = PlateNode(stack.getTop().getPlate()); 是你的问题,因为你基本上是在创建一个新堆栈。
  • 分段错误是由错误的取消引用导致的。您发布的代码不尊重任何东西,因此错误必须在其他地方。你知道如何使用调试器吗?
  • 这意味着你试图访问不属于你的内存——通常是滥用数组或指针。要修复它,请在调试器中运行您的程序并逐步执行该函数。
  • 我是在 linux 中做的,所以我真的不知道如何调试它

标签: c++ operator-overloading


【解决方案1】:

问题出在这里:

class Stack
{
private:
  PlateNode *ptrTop;
  int stackCount;
public:
  ...    
  Stack(PlateNode top){
    *ptrTop = top;
    stackCount++;}

您正在取消引用一个未初始化的指针——试图将一些东西分配给一个基本上是随机的地址——这会导致一种称为未定义行为的东西,这是一件坏事。你的意思可能是这样的:

ptrTop = top;

无论如何,您应该尝试养成以小步骤开发新功能(例如新类)的习惯,每一步都进行测试。如果你这样做了,你就会知道这个方法有问题。即使您无法立即发现它,您也会一直盯着三行而不是一百五十行。

【讨论】:

  • 这就是我最初的方式,但后来它说“无法在分配中将 plateNode 转换为 plateNode*”,当我使用 ptrTop = &top; 将 * 放在 ptrTop 上时它就消失了也不行
  • 实际使用:ptrTop = &top;确实有效,但分段错误仍然存​​在
  • @ChrisMurphy:我不确定您在该构造函数中的确切意图,我只知道该代码会导致未定义的行为,并且将(正确类型的)值分配给指针不会.一般来说,你不能通过盲目的添加和删除'*'和'&'来解决这样的问题,你必须明白你在做什么。
  • @ChrisMurphy 停止玩弄符号来绕过编译器并真正考虑您的代码。
  • 好吧,对不起,我以为我在做的是将参数 plateNode 置于顶部并将其置于堆栈的顶部。它不这样做吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
  • 2022-11-27
  • 2019-03-28
  • 1970-01-01
相关资源
最近更新 更多