使用重载运算符和成员指针时出现分段错误

时间:2017-10-17 22:21:57

标签: c++ pointers segmentation-fault

所以我对C ++编码很新,在我目前的编程课程中,我们正在学习运算符重载和友元函数。我们被告知要创建一个具有不同类型的构造函数和重载运算符的类Money。当我们没有指向私有成员变量的指针时,程序会容易得多,但现在它有点过头了。

在继续定义其余的重载操作符函数之前,我想得到一些帮助。基本上我要做的是将Money类的两个对象一起添加,但是当我运行程序时,我继续遇到分段错误。我知道这与指针和访问无法访问的内存有关,但我不确定我哪里出错了。

到目前为止这是一个简短的程序,所以代码应该易于阅读。任何帮助将不胜感激!

class Money
{
public:
        Money(int d=0, int c=0);
        Money(const Money&);
//      ~Money();

        Money& operator=(const Money&);
        Money operator+(const Money&) const;
        Money operator-(const Money&) const;
        Money& operator*(double);
        Money& operator/(double);

        friend istream& operator>>(istream&, Money&);
        friend ostream& operator<<(ostream&, const Money&);
private:
        int* dollars;
        int* cents;
};

int main()
{
        Money m1(3, 43), m2(4, 64);

        Money m3 = m1 + m2;

        return 0;
}

Money::Money(int d, int c)
{
        *dollars = d;
        *cents = c;
}


Money Money::operator+(const Money& m1) const
{
        Money result;
        *result.dollars = *this->dollars + *m1.dollars;
        *result.cents = *this->cents + *m1.cents;
        return result;
}

1 个答案:

答案 0 :(得分:2)

您尚未为dollarscents分配内存。您应该在构造函数中执行此操作:

Money::Money(int d, int c)
{
    dollars = new int;
    cents = new int;

    *dollars = d;
    *cents = c;
}

不要忘记在析构函数中释放内存:

Money::~Money() {
    delete dollars;
    delete cents;
}

否则,您只是声明有两个指向int s(dollarscents)的指针,但您实际上并未确定它们指向内存中的有效位置;他们没有初始化。

提示:在实现复制构造函数(Money(const Money&))和运算符时,请尽量记住此资源管理(感谢@LokiAstari彻底)。