类中c ++析构函数的xCode问题

穆斯塔法·哈里尔(Mustafa Khaleel)

我仍在学习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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章