我正在创建一个函数,当我的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语句是打印的,所以我知道调用了运算符并且创建了学生,但是遇到了内存问题。
答案 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);
// ^^^^^^^^^^^^^^^^^^^^^
}
请注意,通过原始指针new
和delete
进行手动内存管理通常是个坏主意。如果您确实需要引用语义,请考虑使用智能指针。