VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 112|回复: 11

[已解决]关于运算符重载的问题

[复制链接]
45_avatar_middle
最佳答案
0 
在线会员 发表于 2020-4-21 11:09:15 | 显示全部楼层 |阅读模式
本帖最后由 Mr-Shuaibi 于 2020-4-21 12:24 编辑
  1. #include <iostream>
  2. using namespace std;

  3. class student
  4. {
  5. public:
  6.         char* pname;
  7.         int num;
  8.         char sex;
  9.         int age;
  10.         student(char* t_name, int t_num, char t_sex, int t_age)
  11.         {
  12.                 int len = strlen(t_name) + 1;
  13.                 pname = new char[len];
  14.                 memset(pname, 0, len);
  15.                 strcpy(pname, t_name);
  16.                 num = t_num;
  17.                 sex = t_sex;
  18.                 age = t_age;
  19.         }

  20.         student()
  21.         {}
  22.         
  23.         ~student()
  24.         {
  25.                 if (pname)
  26.                 {
  27.                         delete[]pname;
  28.                 }
  29.                 cout << "析构已执行" << endl;
  30.     }

  31.         student& operator=(const student& stud)
  32.         {
  33.                
  34.                 sex = stud.sex;
  35.                 num = stud.num;
  36.                 age = stud.age;
  37.         

  38.                  if (pname)                             //????????????
  39.                 {
  40.                         delete[]pname;
  41.                 }
  42.                 int len = strlen(stud.pname) + 1;
  43.                 pname = new char[len];
  44.                 memset(pname, 0, len);
  45.                 strcpy(pname, stud.pname);
  46.                 return *this;
  47.         }
  48. };

  49. int main()
  50. {
  51.          student zhangsan("zhangsan", 1001, 'm', 18);
  52.         student wangwu;
  53.         wangwu = zhangsan;
  54.         return 0;
  55. }
复制代码

按照syc所讲的,在=运算符重载的函数中加上和析构函数中一样的if语句,这时候在一步一步调试的时候就会执行到此处报错,说读取位置时发生访问冲突,所以就将重载中的if语句删了,这样就能正常执行了,这是为啥?

最佳答案
84_avatar_small
2020-4-21 15:44:38
我觉得 在构造函数里加一句
    student()
        {
             pname = NULL;
       }
ce1f6772401b73d8b2e61ce6ec633f7.png
9fa681582a68c8299f77e9dca810df3.png




上一篇:求助 三维坐标点集筛选路径规划
下一篇:一道静态联编和动态联编的题
57_avatar_middle
最佳答案
21 
在线会员 发表于 2020-4-21 11:46:41 | 显示全部楼层
这段代码运行正常,没有报错。如果有,请将截图发出来
45_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-21 12:23:12 | 显示全部楼层
本帖最后由 Mr-Shuaibi 于 2020-4-21 12:25 编辑
JLDawson 发表于 2020-4-21 11:46
这段代码运行正常,没有报错。如果有,请将截图发出来


可是我的析构函数里设置了输出“析构已执行”的命令,执行后什么也没有输出,一步一步调试后发现就是运算符重载的if出了问题,去掉就对了。

具体图片我编辑过了,在原帖子里。
57_avatar_middle
最佳答案
21 
在线会员 发表于 2020-4-21 14:09:09 | 显示全部楼层
Mr-Shuaibi 发表于 2020-4-21 12:23
可是我的析构函数里设置了输出“析构已执行”的命令,执行后什么也没有输出,一步一步调试后发现就是运 ...

1.“析构已执行”未输出在窗口的原因是,你步进调试未调试到最后。你一直步进到程序自动退出。每次步进查看窗口。一定是有输出的。
2.operator=函数中的if在当前展示的代码中应该是没有问题的,请楼主再次确认一下
84_avatar_middle
最佳答案
1 
在线会员 发表于 2020-4-21 15:44:38 | 显示全部楼层    本楼为最佳答案   
bestAnswer
我觉得 在构造函数里加一句
    student()
        {
             pname = NULL;
       }
45_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-21 15:47:07 | 显示全部楼层
JLDawson 发表于 2020-4-21 14:09
1.“析构已执行”未输出在窗口的原因是,你步进调试未调试到最后。你一直步进到程序自动退出。每次步进查 ...

你看我的原帖子,下面有两张图,那个黑窗口就是我执行程序最后的结果,啥都没有,另一幅图就是我步进调试到重载程序里的if语句时出现的错误,到那一步之后按F10步进调试会一直出现这个窗口,根本调试不到最后,把重载程序里的if删了就行了,可以调试到最后,也会显示“析构已执行”,所以想问为什么删了就可以了。关于运算符重载的问题
45_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-21 15:54:46 | 显示全部楼层
dwer 发表于 2020-4-21 15:44
我觉得 在构造函数里加一句
    student()
        {

对对对,这样就对了,感谢感谢
45_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-21 16:14:04 | 显示全部楼层
dwer 发表于 2020-4-21 15:44
我觉得 在构造函数里加一句
    student()
        {

其实不加也可以,在重载函数里的if语句中的delete [ ]pname改为pname=NULL也是可以的,应该是一个作用。
84_avatar_middle
最佳答案
1 
在线会员 发表于 2020-4-21 16:20:44 | 显示全部楼层
本帖最后由 dwer 于 2020-4-21 16:22 编辑
Mr-Shuaibi 发表于 2020-4-21 16:14
其实不加也可以,在重载函数里的if语句中的delete [ ]pname改为pname=NULL也是可以的,应该是一个作用。


其实就是 指针没有初始化,然后分配了一个随机的值,  if(pname) 可以进去, 但是delete的时候那块是无效的

上面你那么不delete的 直接=NULL,那块内存还是被使用了,这么内存泄漏的
45_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-21 16:26:26 | 显示全部楼层
本帖最后由 Mr-Shuaibi 于 2020-4-21 16:30 编辑
dwer 发表于 2020-4-21 16:20
其实就是 指针没有初始化,然后分配了一个随机的值,  if(pname) 可以进去, 但是delete的时候那块是无效 ...


明白了,受教了,那我=NULL后,在if里再加上一句delete [ ]pname可不可以呢
07_avatar_middle
最佳答案
4 
在线会员 发表于 2020-4-21 16:46:03 | 显示全部楼层
上面已经有人给出解决方案了,回复一下主要是提醒楼主,对于C/C++,请养成指针使用前必须初始化的习惯。请让指针无时无刻都处于一个你自己指定的状态下,不要依赖编译器的动作。
84_avatar_middle
最佳答案
1 
在线会员 发表于 2020-4-21 19:02:48 | 显示全部楼层
Mr-Shuaibi 发表于 2020-4-21 16:26
明白了,受教了,那我=NULL后,在if里再加上一句delete [ ]pname可不可以呢

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

本版积分规则

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

关闭

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

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

GMT+8, 2020-7-9 17:00

Powered by CcTry.CoM

© 2009-2020 cctry.com

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