int main()
{
int *pnPtr = new int;
delete pnPtr;
*pnPtr = 4;
cout<<*pnPtr;
}
Ans) 4
当我尝试在visual studio 2010中执行时。
请解释一下4
如何显示为输出?
答案 0 :(得分:4)
你期望它返回什么?
理解,删除只释放指向的已分配内存,但保留指针。您仍然可以使用指针对指向的地址执行某些操作。
int main()
{
int *pnPtr = new int; // allocate memory, pnPtr now points to it
delete pnPtr; // delete allocated memory, pnPtr still points to that location
*pnPtr = 4; // set memory at pointed address to 4
cout<<*pnPtr;
}
答案 1 :(得分:1)
指针pnPtr
仍指向内存中的某个位置,调用delete
不会更改pnPtr
本身的值。内存不再为您的流程分配。
答案 2 :(得分:0)
问题是由于Dangling pointers
在对象销毁期间出现,当一个具有传入引用(指针)的对象被释放或取消分配时,而不修改指针的值 ,以便指针仍然指向解除分配的内存的内存位置。
假设系统将先前释放的内存重新分配给另一个进程,如果原始程序然后取消引用(现在)悬空指针,则可能导致不可预测的行为,因为内存现在可能完全包含不同的数据。如果程序将数据写入由悬空指针指向的内存中,则可能会导致无关数据的静默损坏,从而导致:
因此,建议按如下方式重置释放/删除的指针:
int main()
{
int *pnPtr = new int;
delete pnPtr;
pnPtr = null;
// To-do Logic
return 0;
}
答案 3 :(得分:0)
delete不会更改指针的值,它会破坏int size内存关联,但如果没有重新分配则可以使用它。这种情况发生在你的情况下。