VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 130|回复: 4

运算符的重载与类对象的复制

[复制链接]
53_avatar_middle
最佳答案
0 
donate_vip 发表于 2020-7-6 09:35:24 | 显示全部楼层 |阅读模式
#include <iostream>
using namespace std;
#include<string>

class Cstudent
{
private:
        int mark;
        char *name;
public:
        Cstudent &operator+ (const Cstudent &stud);
        Cstudent &operator= (const Cstudent &stud);
        Cstudent(int mark, char *name);
        Cstudent(){}
        ~Cstudent();
        void out()
        {
                cout << name << "的分数为:" << mark << endl;
        }
};

Cstudent& Cstudent::operator+ (const Cstudent &stud)
{
        int i = strlen(stud.name) + 1;
        this->name = new char[i];
        memset(this->name, 0, strlen(this->name) + 1);
        strcpy(this->name, stud.name);
        this->mark += stud.mark;
        return *this;
}

Cstudent& Cstudent::operator= (const Cstudent &stud)
{
        this->name = new char[strlen(stud.name) + 1];
        memset(this->name, 0, strlen(this->name) + 1);
        strcpy(this->name, stud.name);
        this->mark = stud.mark;
        return *this;
}

Cstudent::Cstudent(int mark, char *name)
{
        this->mark = mark;
        this->name = new char[strlen(name) + 1];
        memset(this->name, 0, strlen(this->name) + 1);
        strcpy(this->name, name);
}

Cstudent::~Cstudent()
{
        cout << "调用析构函数进行收尾工作" << this->mark << endl;
        if (this->name)
        {
                delete[] this->name;
        }
}

int main()
{
        char str1[] = "超级霸霸强", str2[] = "超级无敌霸霸强";
        Cstudent stud1(89, str1), stud2(87, str2), stud3;
        stud3 = stud1 + stud2;
        stud3.out();
}
请问一下,我这个程序为何还是会出现重复释放内存的现象?我在重载运算符中申请了内存的呀?因该可以对含有指针的类对象进行赋值与+法操作的呀?




上一篇:codeblocks 如何设置Unicode编码,和_UNICODE的宏定义
下一篇:MFC WPS Excel
70_avatar_middle
最佳答案
21 
在线会员 发表于 2020-7-6 13:49:26 | 显示全部楼层
你所有memset的长度都写错了
  1. memset(this->name, 0, strlen(this->name) + 1);
复制代码

strlen 里应该是入参的name长度 ,你都用的this->name
另外这些地方没必要memset,直接去掉就好了
53_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-7-6 15:10:58 | 显示全部楼层
tony666 发表于 2020-7-6 13:49
你所有memset的长度都写错了

strlen 里应该是入参的name长度 ,你都用的this->name

好的,我纠正错误,但是为什么当最后析构的时候,同一个指针会释放两次,我在重载=的时候都已经动态分配内存了呀?
70_avatar_middle
最佳答案
21 
在线会员 发表于 2020-7-6 17:50:00 | 显示全部楼层
超级霸霸强 发表于 2020-7-6 15:10
好的,我纠正错误,但是为什么当最后析构的时候,同一个指针会释放两次,我在重载=的时候都已经动态分配 ...

正好是3个构造3个析构呀,没发现释放两次
57_avatar_middle
最佳答案
22 
在线会员 发表于 2020-7-7 09:10:11 | 显示全部楼层
内存泄漏,在new和delete后增加打印字符,可以定位问题
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-10-24 23:39

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表