void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
请问运行Test函数会有什么样的结果?
答:篡改动态内存区的内容,后果难以预料,非常危险。
因为free(str);之后,str成为野指针,
if(str != NULL)语句不起作用。
上面是所给答案,不知道对不对啊!但运行该程序,我总能得到结果,“world”,why,明明我已释放内存了啊?我借助强大的网路,找到了答案!有人说这样做是靠人品吃饭!呵呵!蛮对的啊!
是这样的:系统只是将指针指向的堆空间回收,但是没有将指针变量的值赋值为null,也就是说指针还是指向原来的堆空间,指针没有摧毁,但是这个空间已经失效
所以free(delete)一个指针以后要马上将它赋值为null不然容易导致野指针的出现....,你释放内存后,告诉了os,这块内存我不用了,你可以分配给其他人了,如果str没有指0,下次os将该内存给别人,那结果就危险了!!
如果不考虑多任务或多线程的影响(即紧跟在delete或free后不会发生其它任务或线程调用new或malloc之类的在堆上分配内存的函数),这个写法是可以的。
当然最好还是不要这样写。
参考 讨论结果:http://topic.csdn.net/u/20100426/12/765d0583-17cc-44ff-9fb7-1200cda5e436.html
中兴试题全集:http://user.qzone.qq.com/914122137?ptlang=2052&ADUIN=498527489&ADSESSION=1316307609&ADTAG=CLIENT.QQ.3307_FriendInfo_PersonalInfo.0 不可随便留言,我在网上看到了,非本人!