免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2496 | 回复: 13

delete何时开始生效。 [复制链接]

论坛徽章:
0
发表于 2005-08-07 14:08 |显示全部楼层
本来我认为当对一个使用new分配的变量进行delete后,该变量就应当立即失效了.但使用以下的代码作测试,结果却不是我所预期的.

  1. #include <iostream>;

  2. using namespace std;

  3. class Cat
  4. {
  5. public:
  6.         Cat()
  7.         {
  8.                 cout << "\n Cat Constructs\n";
  9.         }

  10.         ~Cat()
  11.         {
  12.                 cout << "\n Cat Destructs\n";
  13.         }

  14.         void sleep()
  15.         {
  16.                 cout << "\nI'm sleeping\n";
  17.         }

  18.         void speek()
  19.         {
  20.                 cout << "\nMEOW!\n";
  21.         }

  22.         void eat()
  23.         {
  24.                 cout << "\nWhere is the mouse!\n";
  25.         }
  26. };
  27.        

  28. int main()
  29. {
  30.         Cat* cat = new Cat();
  31.         if (NULL == cat)
  32.                 return -1;
  33.         delete cat;
  34.         cat->;eat();                //Works;
  35.         return (0);
  36. }
复制代码

输出:
Cat Constructs

Cat Destructs

Where is the mouse!
有兄弟能帮我解释一下吗?

论坛徽章:
0
发表于 2005-08-07 14:27 |显示全部楼层

delete何时开始生效。

估计delete cat只是调用了析构函数, 而析构函数一般用来释放资源
但是cat指针仍然在程序里面
并没有如你所愿变成NULL(cat 并不是malloc分派空间)
所以仍然可以调用,但是不能访问已经释放掉的资源
你没申请什么资源, 所以应该就是你看到的样子

论坛徽章:
0
发表于 2005-08-07 14:27 |显示全部楼层

delete何时开始生效。

你如果在Cat类中加一个数据成员,并在构造函数中将其赋个初值,然后,在delete之后看看那个数据成员的值就会发现delete的效果了。
不管是delete还是free,都不会将指针置为NULL,所以,良好的习惯是在delete或free或立即将指针置为NULL,否则就会有野指针的问题了。

论坛徽章:
0
发表于 2005-08-07 14:37 |显示全部楼层

delete何时开始生效。


  1. #include <iostream>;

  2. using namespace std;

  3. class Cat
  4. {
  5. public:
  6.         Cat(int val)
  7.         {
  8.                 value = val;
  9.                 cout << "\n Cat Constructs\n";
  10.         }

  11.         ~Cat()
  12.         {
  13.                 cout << "\n Cat Destructs\n";
  14.         }

  15.         void sleep()
  16.         {
  17.                 cout << "\nI'm sleeping\n";
  18.         }

  19.         void speek()
  20.         {
  21.                 cout << "\nMEOW!\n";
  22.         }

  23.         void eat()
  24.         {
  25.                 cout << "\nWhere is the mouse!\n";
  26.         }
  27. private:
  28.         int value;                       
  29. };
  30.        

  31. int main()
  32. {
  33.         Cat* cat = new Cat(10);
  34.         if (NULL == cat)
  35.                 return -1;
  36.         delete cat;
  37.        
  38.         int* tmp = new int[100000];
  39.         if (NULL ==tmp)
  40.                 return (-1);
  41.         *tmp = 100;
  42.         delete []tmp;
  43.         cat->;eat();                //Works;
  44.         return (0);
  45. }

复制代码

修改后结果:

Cat Constructs

Cat Destructs

Where is the mouse!
我也知道应当是无效的,但不知怎么会出现这种结果.会不会是因为这是在C++中没有定义的行为.

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
发表于 2005-08-07 14:44 |显示全部楼层

delete何时开始生效。

改成下面再试试
  void eat()
   {
      value++;
      cout << "\nWhere is the mouse!\n";
   }

论坛徽章:
0
发表于 2005-08-07 15:03 |显示全部楼层

delete何时开始生效。

还是一样

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
发表于 2005-08-07 15:26 |显示全部楼层

delete何时开始生效。

不好意思,是我大意看错了。我说成以前遇到的情况了:

  1. #include <iostream>;
  2. using namespace std;
  3. class Cat
  4. {
  5.         public:
  6.                 void eat()
  7.                 {
  8.                                                 //value++;     //this is the fault
  9.                         cout << "\nWhere is the mouse!\n";
  10.                 }
  11.         private:
  12.                 int value;         
  13. };
  14. int main()
  15. {
  16.         Cat* cat;
  17.         cat->;eat();      //Works;
  18.         return (0);
  19. }
复制代码

你说的情况,还真是如你所说,,,一会想想看。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2005-08-07 15:42 |显示全部楼层

delete何时开始生效。

野指针.

论坛徽章:
0
发表于 2005-08-08 09:00 |显示全部楼层

delete何时开始生效。

delete成功后只是给那块内存做个可以回收的标记,并不马上清空。
你通过原来的指针还是可以看到里面的东东,就像你写的那些。
反正我们通常做法是, delete后马上把指向原来的那块内存的指针赋Null
SirFang 该用户已被删除
发表于 2005-08-08 10:26 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP