VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 444|回复: 5

析构函数delete指针报错

[复制链接]
16_avatar_middle
最佳答案
0 
在线会员 发表于 2020-8-11 21:36:58 | 显示全部楼层 |阅读模式
  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. class person{
  5. public:
  6. &#160; &#160; &#160; &#160; char* pname;
  7. &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; person(char *name)
  8. &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; {&#160; &#160; &#160; &#160;
  9. &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; int len = strlen(name);
  10. &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; pname = new char(len+1);
  11. &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; memset(pname,0,len+1);
  12. &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; strcpy(pname,name);
  13. &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; cout << pname <<endl;
  14. &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; }

  15. &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; ~person(){
  16. &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; if(pname){
  17. &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; delete[] pname;
  18. &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; cout << "析构调用";
  19. &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; }
  20. &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; }

  21. };
  22. int main(){
  23. &#160; &#160; &#160; &#160;
  24. &#160; &#160; &#160; &#160;
  25. &#160; &#160; &#160; &#160; {
  26. &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; person st1("123231321231312123312");
  27. &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; person st2("213123");
  28. &#160; &#160; &#160; &#160; }
  29. &#160; &#160; &#160; &#160; system("pause");
  30. &#160; &#160; &#160; &#160; return 0;
  31. }
复制代码


在类中我new了一块空间pname,之后析构进行delete删除掉。
如上代码我实例化了两个,一个st1 一个st2
问下各位前辈,为什么我的st2一旦调用delete就出现错误呢。。
难道是 st1和st2的pname是一块内存空间吗?
不应该是如下图这样的吗?我实例化一个对象  构造函数就new一块空间
析构函数delete指针报错




上一篇:有关屏幕截图教程的提问
下一篇:大佬们 字符串课程 string_util 这个类 有知道在哪下载的嘛 求大佬帮忙看看
70_avatar_middle
最佳答案
23 
在线会员 发表于 2020-8-11 23:46:42 | 显示全部楼层
拷贝构造函数没有给pname 赋值,pname默认值并不是 0 ,(vs好像都是 0xcdcdcdcd) ,
所以析构报错了
16_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-8-11 21:38:02 | 显示全部楼层
代码如下:
  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. class person{
  5. public:
  6.         char* pname;
  7.                 person(char *name)
  8.                 {       
  9.                 int len = strlen(name);
  10.                 pname = new char(len+1);
  11.                 memset(pname,0,len+1);
  12.                 strcpy(pname,name);
  13.                 cout << pname <<endl;
  14.                 }
  15.                 person(person &s){
  16.                         cout << "拷贝构造调用"<<endl;
  17.                 }

  18.                 ~person(){
  19.                         if(pname){
  20.                                 //delete[] pname;
  21.                                 cout << "析构调用";
  22.                         }
  23.                 }

  24. };
  25. int main(){
  26.        
  27.        
  28.         {
  29.                 person st1("123231321231312123312");
  30.                 person st2(st1);
  31.         }
  32.         system("pause");
  33.         return 0;
  34. }
复制代码
61_avatar_middle
最佳答案
0 
在线会员 发表于 2020-8-12 09:37:23 | 显示全部楼层
你拷贝后就有两个pname了(名字相同),当st1释放指针pname时,凡是叫pname的就都被释放了(所以两个pname都释放了),所以当st2来释放属于他的pname时,就找不到了。
74_avatar_middle
最佳答案
1 
在线会员 发表于 2020-8-13 10:27:14 | 显示全部楼层
本帖最后由 User_Ghost 于 2020-8-13 10:31 编辑

调试的时候发现,st2的pname的地址是0x8,并不为0,所以析构函数才会按照st1的方式delete,所以应该在拷贝构造函数里给pname赋为空地址NULL,那么pname就是0x0了,也就不会delete了。构造函数因为有重载,所以执行完拷贝构造函数以后,不会执行其余构造函数,因此pname在构造的时候并没有动态分配空间。但至于为什么pname不为0,我个人认为应该是系统在指针变量定义时是随机分配地址,因此各种书籍上都建议在指针变量定义后初始化为空地址。
  1.     char *pname;
  2.     person(char *name)
  3.     {
  4.         int len = strlen(name);
  5.         pname = new char[len + 1];
  6.         memset(pname, 0, len + 1);
  7.         strcpy(pname, name);
  8.         cout << pname << endl;
  9.     }
  10.     person(person &s)
  11.     {
  12.         cout << "拷贝构造调用" << endl;
  13.     }
  14.     ~person()
  15.     {
  16.         if (pname)
  17.         {
  18.             delete[] pname;
复制代码

57_avatar_middle
最佳答案
22 
在线会员 发表于 2020-8-13 16:01:16 | 显示全部楼层
错误原因:
1.楼主申请自由存储区的代码为:pname = new char(len+1);
只申请了一个字节的空间。
可更改为:pname = new char[len + 1];
2.拷贝函数中未对pname做任何操作,会出现随机值。如果为空不会进行delete。如果未野指针,那就会报错了。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

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

关闭

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

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

GMT+8, 2020-11-29 17:41

Powered by CcTry.CoM

© 2009-2020 cctry.com

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