【问题标题】:Program received signal SIGSEGV, Segmentation fault in output程序接收信号 SIGSEGV,输出分段错误
【发布时间】:2013-12-05 23:40:21
【问题描述】:

我在调试程序时遇到了这个奇怪的错误(程序收到信号 SIGSEGV,分段错误 -> 指向下面的代码行)。拜托,真的需要你的帮助。我正在尝试设置一些“if”条件来处理构造函数和析构函数中的“负”初始化值。

class a
{
public:
    a(int _number1=0, float* _array1=NULL);
    ~a();
    friend ostream& operator<<(ostream& output1, a& all_1);
private:
    int number1;
    float* array1;
};

class b
{
public:
    b(int _number2=0, float* _array2=NULL);
    ~b();
    friend ostream& operator<<(ostream& output2, b& all_2);
private:
    int number2;
    float* array2;
};

a::a(int _number1, float* _array1)
{
    if(_number1>0)
    {
        number1 = _number1;
        array1 = new float[number1];
        memset(array1, 0, number1*sizeof(float));
    }
    else array1=_array1;
}

a::~a()
{
    if(number1>0) delete[] array1;
}

ostream& operator<<(ostream& output1, a& all_1)
{
    if(all_1.number1>0)
    {
        for(int i=0;i<all_1.number1;i++) output1<<all_1.array1[i]<<"\n";
    }
    else output1<<"";
    return(output1);
}

b::b(int _number2, float* _array2)
{
    if(_number2>0)
    {
        number2 = _number2;
        array2 = new float[number2];
        memset(array2, 0, number2*sizeof(float));
    }
    else array2=_array2;
}

b::~b()
{
    if(number2>0) delete[] array2;
}

ostream& operator<<(ostream& output2, b& all_2)
{
    if(all_2.number2>0)
    {
        for(int i=0;i<all_2.number2;i++) output2<<all_2.array2[i]<<"\n"; //This is where the error appeared.
    }
    else output2<<"";
    return(output2);
}

int main()
{
    a input1(-1);
    b input_1(-1);
    cout<<input1;
    cout<<input_1;
}

【问题讨论】:

  • 程序在单独定义“a 类”时工作......但是当我添加“b 类”时......程序构建完全没有错误但是当我运行它时......程序崩溃...因此我使用调试器发现了这个奇怪的错误...

标签: c++


【解决方案1】:

all_2.array2[i]NULL[i] 因为您没有为负数初始化数组。

对于负输入,您忘记在构造函数中将 all_2.number2 初始化为 0。

【讨论】:

  • 但它不会跳过“if”条件,因为“all_2.number2 小于 0”..?
  • 哇……明白了……太棒了
【解决方案2】:

问题是如果构造函数的第一个参数是负数,你不会初始化数据成员 number2。所以 number2 可以保存任意值。这就是异常结束的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多