VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1101|回复: 9

[已解决]求助各位老师 关于赋值运算符重载问题

[复制链接]
76_avatar_middle
最佳答案
0 
在线会员 发表于 2020-6-9 13:30:35 | 显示全部楼层 |阅读模式
#define  _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;


class dog
{
public:
        int age;
        int num;
        char* p_name;

        ~dog()
        {
                if (p_name)
                {
                        delete[] p_name;
                        p_name = NULL;
                }
        }
        dog& operator=(dog& p)
        {
                age = p.age;
                num = p.num;

                if (p_name)
                {
                        delete[] p_name;
                        p_name = NULL;
                }

                int name_lens = strlen(p.p_name) + 1;
                p_name = new char[name_lens];
                memset(p_name, 0, name_lens);
                strcpy(p_name, p.p_name);

                return *this;
        }
};

void test()
{

        dog d1;
        d1.age = 18;
        d1.num = 1;
        char str[] = "zhaoguoliang";
        d1.p_name = str;
        dog d2;
        d2 = d1;
        cout << d2.age << "  " << d2.num << "  " << d2.p_name << endl;

}
int main()
{
        test();
       

        system("pause");
        return 0;

}



错误

错误
最佳答案
70_avatar_small
2020-6-10 14:07:59
    char str[] = "zhaoguoliang";
    d1.p_name = str;

这个str 是栈里的,不能用delete
类中的指针最好不要直接赋值
  1.     void Set_Pname(const char* _p_name) {
  2.         if (p_name) {
  3.             delete[] p_name;
  4.             p_name = NULL;
  5.         }
  6.         p_name = new char[strlen(_p_name) + 1];
  7.         strcpy(p_name, _p_name);
  8.     }
  9. 调用
  10. d1.Set_Pname("VC驿站");
复制代码





上一篇:VS2017,SetFilePointer函数从后往前读取数据出现错误
下一篇:一个大二学生的迷茫
76_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-6-9 13:32:04 | 显示全部楼层
一直出现如图问题  也不知道哪里出了问题 各位老师帮助一下 感谢
76_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-6-9 13:35:44 | 显示全部楼层
这个是用复制运算符重载 解决内存重复释放问题     但是一直这个样子
51_avatar_middle
最佳答案
90 
online_admins 发表于 2020-6-9 16:07:43 | 显示全部楼层
赵国梁 发表于 2020-6-9 13:35
这个是用复制运算符重载 解决内存重复释放问题     但是一直这个样子

程序执行完之后崩溃了吗?
还是什么情况,编译没问题,执行报错了?
76_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-6-9 17:53:45 | 显示全部楼层
Syc 发表于 2020-6-9 16:07
程序执行完之后崩溃了吗?
还是什么情况,编译没问题,执行报错了?

是的 老师  生成没问题  执行就这样
51_avatar_middle
最佳答案
90 
online_admins 发表于 2020-6-9 17:59:34 | 显示全部楼层
给 dog 类加个构造函数就可以了:
  1. dog()
  2. {
  3.         age = 0;
  4.         num = 0;
  5.         p_name = NULL;
  6. }
复制代码
76_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-6-9 19:22:19 | 显示全部楼层
Syc 发表于 2020-6-9 17:59
给 dog 类加个构造函数就可以了:

老师 还是不行
96_avatar_middle
最佳答案
0 
在线会员 发表于 2020-6-9 21:19:54 | 显示全部楼层
是你的析构器重复调用,释放已经被释放的内存造成的
76_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-6-10 08:40:48 | 显示全部楼层
zhizhuo.li 发表于 2020-6-9 21:19
是你的析构器重复调用,释放已经被释放的内存造成的

老哥  我该怎么改啊
70_avatar_middle
最佳答案
49 
在线会员 发表于 2020-6-10 14:07:59 | 显示全部楼层    本楼为最佳答案   
bestAnswer
    char str[] = "zhaoguoliang";
    d1.p_name = str;

这个str 是栈里的,不能用delete
类中的指针最好不要直接赋值
  1.     void Set_Pname(const char* _p_name) {
  2.         if (p_name) {
  3.             delete[] p_name;
  4.             p_name = NULL;
  5.         }
  6.         p_name = new char[strlen(_p_name) + 1];
  7.         strcpy(p_name, _p_name);
  8.     }
  9. 调用
  10. d1.Set_Pname("VC驿站");
复制代码

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

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

关闭

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

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

GMT+8, 2023-5-29 23:34

Powered by CcTry.CoM

© 2009-2021 cctry.com

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