csthh 2024-03-15 16:26 采纳率: 62.5%
浏览 54
已结题

为什么在析构函数里面用了delete会报错

运行程序后会在最后一次delete停住

#include<iostream>
using namespace std;
class course
{
    public:
    char *name;
    float credit;
    course()
    {
        name=new char[20];
        name="math";
        credit=3.5;
    }
    course(char *a,int b)
    {
        name=new char[20];
        name=a;
        credit=b;
    }
    ~course()
    {
        cout<<"调用析构函数"<<endl;
        delete [] name;
    }
    void print()
    {
        cout<<"课程名:"<<name<<' '<<"学分:"<<credit<<endl;
    }
};

int main()
{
    course A;
    A.print();
    course B("English",2.5);
    B.print();
    return 0;
}


哪个位置有问题,应该怎么解决呢

  • 写回答

3条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2024-03-15 18:30
    关注

    【以下回答由 GPT 生成】

    问题出在析构函数中使用了delete操作,但在构造函数中又进行了name指针的赋值,导致delete时出现错误。应该避免重复赋值name指针,可以改为使用strcpy来进行字符串拷贝。

    以下是修改后的代码:

    #include<iostream>
    #include<cstring>
    using namespace std;
    class course
    {
    public:
        char *name;
        float credit;
        course()
        {
            name=new char[20];
            strcpy(name, "math");
            credit=3.5;
        }
        course(char *a, float b)
        {
            name=new char[20];
            strcpy(name, a);
            credit=b;
        }
        ~course()
        {
            cout<<"调用析构函数"<<endl;
            delete [] name;
        }
        void print()
        {
            cout<<"课程名:"<<name<<' '<<"学分:"<<credit<<endl;
        }
    };
    
    int main()
    {
        course A;
        A.print();
        course B("English",2.5);
        B.print();
        return 0;
    }
    

    通过上述修改,在构造函数和析构函数中保持一致的内存管理方式,即通过new/delete或malloc/free分配和释放内存,避免重复赋值name指针,可以解决程序停止运行的问题。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被专家选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月26日
  • 专家已采纳回答 3月18日
  • 创建了问题 3月15日