一个关于new与delete的简单有关问题。分配内存后,然后再delete,为啥前后指针p的地址没有发生变化?
一个关于new与delete的简单问题。分配内存后,然后再delete,为啥前后指针p的地址没有发生变化??
------解决方案--------------------
一定程度上依赖于compiler,可能delete不一定马上破坏该空间,可能只是做了标志,表明该地址被系统回收,但delete不会改变p的值。如果仍继续使用p,后面的操作将导致undefined behavior。
这表明了C++中指针的危险性。
------解决方案--------------------
new 和 delete 处理的是内存分配相关的事情
不是指针指向的问题 想改变指针 请用 =
------解决方案--------------------
delete后应该只是释放了p所指向的内存单元,这样其它程序就可以使用这个单元了
但是p的值如果没有手动去改的话就不会改变
只是个人理解....
------解决方案--------------------
楼主,首先告诉你一件事,你理解的有错误,不知道你知不知道野指针
如下代码:
代码结果如下:
delete之前的p内容:1
delete之后的p内容:1128040
delete所做的工作只是把p指向的地址(1128040)中的内容清空,别人可以用这块地址
而这个p本身没有变化,如果再用p那么p就是野指针了
所以安全的做法是
delete p;
p=NULL;
你的意思是delete之后p也灰飞烟灭了是吧,那p=NULL这句话就报错了。
还有一个主意点就是你知道delete和free的区别吗
delete比free除了调用析构函数外,还多了个判断
就是
if(p!=NULL)
free(p);
即使你在程序中使用malloc,free替换new,delete
p的值也不会发生改变,但是*p已经被清空了,这块空间可以被其他人使用。
懂了吗?
#include<iostream>
using namespace std;
int main()
{
int *p;
p=new int;
cout<<"";
delete p; //调试发现p被delete前后的地址值没变,怎么会不变??不是应该变化吗??郁闷
cout<<"";
return 0;
}
------解决方案--------------------
一定程度上依赖于compiler,可能delete不一定马上破坏该空间,可能只是做了标志,表明该地址被系统回收,但delete不会改变p的值。如果仍继续使用p,后面的操作将导致undefined behavior。
这表明了C++中指针的危险性。
------解决方案--------------------
new 和 delete 处理的是内存分配相关的事情
不是指针指向的问题 想改变指针 请用 =
------解决方案--------------------
delete后应该只是释放了p所指向的内存单元,这样其它程序就可以使用这个单元了
但是p的值如果没有手动去改的话就不会改变
只是个人理解....
------解决方案--------------------
楼主,首先告诉你一件事,你理解的有错误,不知道你知不知道野指针
如下代码:
#include<iostream>
using namespace std;
int main()
{
int *p=new int(1);
cout<<"delete之前的p内容:"<<*p<<endl;
free(p); //调试发现p被delete前后的地址值没变,怎么会不变??不是应该变化吗??郁闷
cout<<"delete之后的p内容"<<*p<<endl;
system("pause");
return 0;
}
代码结果如下:
delete之前的p内容:1
delete之后的p内容:1128040
delete所做的工作只是把p指向的地址(1128040)中的内容清空,别人可以用这块地址
而这个p本身没有变化,如果再用p那么p就是野指针了
所以安全的做法是
delete p;
p=NULL;
你的意思是delete之后p也灰飞烟灭了是吧,那p=NULL这句话就报错了。
还有一个主意点就是你知道delete和free的区别吗
delete比free除了调用析构函数外,还多了个判断
就是
if(p!=NULL)
free(p);
即使你在程序中使用malloc,free替换new,delete
p的值也不会发生改变,但是*p已经被清空了,这块空间可以被其他人使用。
懂了吗?