new和delete的问题

BaiYangSpirit 2006-04-18 08:08:21
源程序如下:
#include<iostream.h>

class AA
{
public:
AA(int i, int j)
{
A=i; B=j;
cout<<"构造函数.\n";
}
~AA()
{
cout<<"析构函数.\n";
}
void print();
private:
int A, B;
};

void AA::print()
{
cout<<"打印\n";
}

void main()
{
AA *a1 = 0, *a2 = 0;
a1 = new AA(1, 2);
a2 = new AA(5, 6);

delete a1;
a1 = 0;
a1->print(); //为什么这个还是正确的??
delete a2;
}
结果如下:
构造函数.
构造函数.
析构函数.
打印
析构函数.
======================================
问题:
怎么a1->print(); 还是正确的?
...全文
210 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
bobojing8841 2006-04-19
  • 打赏
  • 举报
回复
delete a1;
a1 = 0;
楼主的这两步已经很标准的释放了a1。
bobojing8841 2006-04-19
  • 打赏
  • 举报
回复
同意楼上两位的观点,前面一些网友没有仔细看程序,也没有动手编译一下,就在大谈野指针什么的,会误导楼主的

楼主明明已经将指针指向0了!
abblly 2006-04-19
  • 打赏
  • 举报
回复
void main()
{
AA *a1 = 0;
a1->print(); //为什么这个还是正确的??

}
楼主看看这个程序
abblly 2006-04-19
  • 打赏
  • 举报
回复

a1=0;是将a1指向地址为0x00000的内存空间(据说一般是代码区与栈区分界地址),并非空指针。
a1=NULL;是标准的空指针。

-------------------------
不同意这个观点,NULL就是0,而且C++之父从来不用a=null这个写法,直接用a=0
用a=null只是为了大家方便读程序。
lonelyforest 2006-04-19
  • 打赏
  • 举报
回复
这个野指针的问题,你的变量指针所分配的控件已经释放,表示其他进程可以使用了,但是并没有吧你的指针给 = NULL; 这个要你自己作。
程序没有那么智能的;
bobojing8841 2006-04-19
  • 打赏
  • 举报
回复
我试过了,设置成NULL还是有问题的

我的看法是:首先,在堆栈中分配的内存仅是AA::A和AA::B,而函数代码是在别的空间分配的。所以调用delete后堆栈中的A和B都没有了,但函数代码并没有因此清空(一个类共用一份函数代码)。所以通过类型检查,得知a1的类型后,便能正确找到该函数的执行地址加以执行。

巧合的是,你的print()函数偏偏只输出一个字符串常量(也不是在堆栈分配的,不受delete影响),所以便能正确执行

如果你试着在print()中打印A的值(cout<<"打印"<< A<<endl;),就会出错,不信楼主自己试试。
Muf 2006-04-19
  • 打赏
  • 举报
回复
没关系,只要print中没有用到this指针,结果永远是对的。
「已注销」 2006-04-18
  • 打赏
  • 举报
回复
就像你在餐馆吃完了饭,暂时还坐在桌子上,但下一位客人可以随时坐在你的这个位置,这时你就必须离开。
NULL就是0。
luffy27 2006-04-18
  • 打赏
  • 举报
回复
mark
njaulhm 2006-04-18
  • 打赏
  • 举报
回复
delete a1;
只是释放a1指向的空间,但是a1的值仍然有效,只是指向的空间已经释放了
应该是对象还是存在,指向的内存释放掉!
MulinB 2006-04-18
  • 打赏
  • 举报
回复
a1=0;是将a1指向地址为0x00000的内存空间(据说一般是代码区与栈区分界地址),并非空指针。
a1=NULL;是标准的空指针。
BaiYangSpirit 2006-04-18
  • 打赏
  • 举报
回复
a1=NULL;

a1 = 0;
有区别么?
sankt 2006-04-18
  • 打赏
  • 举报
回复
void main()
{
AA *a1 = 0, *a2 = 0;
a1 = new AA(1, 2);
a2 = new AA(5, 6);

delete a1;
a1 = 0;
a1->print(); //这属于未定义的行为,非常危险,delete a1;做了两件事情
1 调用析构函数
2 释放a1指向的空间,但是a1的值仍然有效,只是指向的空间已经释放了
所有的后果由程序员承担
建议delete a1;后将a1=NULL;


delete a2;
}
tonyzhengjq 2006-04-18
  • 打赏
  • 举报
回复
因为他只取消了内存分配,(注:其它程序可以分配到这块内存)
a1->print(); 打印出来的内容是不可靠的,有可能随时会改变,现在你打印出来是正确的,是因为内容还没有改变!
是一个野指针

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧