运算符重载分段错误

时间:2013-04-26 18:40:04

标签: c++

我正在创建一个函数,当我的Student类中的两个对象被重载时,该函数会重载+运算符。该函数应添加其年龄和高度(该类的两个受保护数据字段)。然后它调用构造函数来创建具有这些字段的新Student。它也是模板中的练习,因此无法删除这些字段。

编译程序时,我在运行时遇到分段错误。使用cout语句,我可以看到正在创建新的Student并且退出构造函数,但随后发生了分段错误。我意识到这一定是内存问题,但我无法找到解决方案。我尝试使用动态内存在重载运算符和main函数中创建新学生,但错误仍然存​​在。

这是构造函数:

template <typename T>
Student<T>::Student(int age, int height)
{
    this->age = age;
    this->height = height;

    cout << "New student created"<< endl;
    return;
}  

这是重载的运算符函数:

template<typename T>
Student<T> Student<T>::operator+(Student<T> &secondStudent) const
{
    int a = age + secondStudent.getAge();
    int h = height + secondStudent.getHeight();

    new Student(a, h);
}

这是主要功能:

Student<int> *s2 = new Student<int>(15, 63);
Student<int> *s3 = new Student<int>(18, 72);

Student <int> s4 = (*s2+ *s3);
cout << "did it return?" << endl;

请注意,两个cout语句是打印的,所以我知道调用了运算符并且创建了学生,但是遇到了内存问题。

2 个答案:

答案 0 :(得分:2)

您的operator +重载不会返回任何内容(您没有return语句),因此您将获得未定义的行为(分段错误的原因)。此外,您的operator +函数会忽略new的返回值而无缘无故地导致内存泄漏。这里没有理由使用new。你想说:

template<typename T>
Student<T> Student<T>::operator+(Student<T> &secondStudent) const
{
    int a = age + secondStudent.getAge();
    int h = height + secondStudent.getHeight();

    return Student(a, h);
}

除非您有特定的理由在堆上分配内容,否则不需要在C ++中使用new关键字。 (new指针返回给动态分配的对象。)在您的情况下,您只想创建并返回Student对象。

答案 1 :(得分:2)

问题在于:

template<typename T>
Student<T> Student<T>::operator+(Student<T> &secondStudent) const
{
    int a = age + secondStudent.getAge();
    int h = height + secondStudent.getHeight();

    new Student(a, h);
//  ^^^^^^^^^^^^^^^^^^
}

您正在动态创建对象,但函数中没有return语句。这是未定义的行为(此外,您还泄漏了该对象,因为没有对delete的相应调用)。相反,你可以写:

template<typename T>
Student<T> Student<T>::operator+(Student<T> &secondStudent) const
{
    int a = age + secondStudent.getAge();
    int h = height + secondStudent.getHeight();

    return Student(a, h);
//  ^^^^^^^^^^^^^^^^^^^^^
}

请注意,通过原始指针newdelete进行手动内存管理通常是个坏主意。如果您确实需要引用语义,请考虑使用智能指针。