我仍在学习c ++,现在尝试了解构造函数和析构函数。
每当我使用构造函数和析构函数时,我只会不断收到以下错误。在我班上。
测试(32992,0x100394380)malloc:*对象0x100707010的错误:未分配要释放的指针*在malloc_error_break中设置一个断点以进行调试(lldb)
尽管我可以通过删除Destructor来消除错误,但是我知道这不是一个很好的编程,因为我必须释放内存。
这是我的代码。
#include <iostream>
using namespace std;
class student{
private:
int *age, *mark1,*mark2,*mark3;
string *name;
public:
friend float avg(student);
student(){
age = new int;
mark1 = new int;
mark2 = new int;
mark3 = new int;
name = new string;
cout << "Enter student name: "; cin >> *name;
cout << "Enter student age: "; cin >> *age;
cout << "Enter student 3 marks: "; cin >> *mark1 >> *mark2 >> *mark3;
cout << endl; }
~student(){
delete age;
delete mark1;
delete mark2;
delete mark3;
delete name; }
string returnName(){
return *name; }
};
float avg(student s){
return (double)(*s.mark1+*s.mark2+*s.mark3)/3;}
int main() {
student s[2];
for (int i = 0; i < 2; i++) {
s[i];
cout << "Avg of student " << s[i].returnName() << " is " << avg(s[i]) << endl;
}
}
问题是,你传递一个参数的值来avg()
。您的示例调用了两个不同的事物s
,因此我将尝试通过调用它们s_main
和来区分它们s_avg
。
当您通过值传递参数时,C ++将数据复制s_main
到中s_avg
。这是通过复制构造函数完成的。您可以指定自己的副本构造函数,但如果不指定,则编译器会为您提供一个。默认的复制构造函数只是将数据复制过来。在您的情况下,它student
由指针组成,因此默认的复制构造函数将复制指针。它不会复制指针指向的数据。
因为s_avg
是本地的avg()
,返回时avg
必须销毁s_avg
。因此,avg()
呼叫student
的析构函数上s_avg
在管线37的端部实际上来说,这意味着avg()
删除指针中s_main[0]
和s_main[1]
当它返回。
这就为设置了问题main()
。因为s_main[0]
和s_main[1]
是本地的main()
,main
必须销毁s_main[0]
并s_main[1]
在返回时销毁。因此,main()
电话student
上的析构函数s_main[0]
,并s_main[1]
在线路47作为前结束,析构函数试图删除指针均s_main[0]
和s_main[1]
-但他们已经被删除!因此,你的问题。
有几种方法可以解决此问题。一种是遵守Igor的建议:您实际上并不需要指针。但是,我可以想象,也许您需要针对实际场景的指针,而不是这种玩具场景。在这种情况下,解决此问题的另一种方法是将参数传递给avg()
by reference。无论如何,这实际上是大多数时候在C ++中传递参数的正确方法:您不必担心复制构造函数或C ++专业的任何怪异事物。确切地说,您应该更改第12行,以便它读
friend float avg(student &);
然后更改第28行,使其显示为
float avg(student & s){
然后它将正常工作。
但是严格来说,除非您计划以某种方式修改数据(可能会发生),否则应使用常量引用。在这种情况下,将第12行更改为
friend float avg(const student &);
然后28行到
float avg(const student & s){
而且,它将像魅力一样工作。
但实际上,伊戈尔是对的。现代C ++旨在帮助您避免使用指针,这恰恰是因为跟踪指针非常困难,并且错误后果非常危险。通过引用传递就是一个很好的例子。因此,除非绝对必须使用指针,否则请避免使用指针。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句