为什么我在visual studio 2010中运行代码后得到4作为输出

时间:2015-07-09 09:10:14

标签: c++ visual-studio-2010

int main()
{
int *pnPtr = new int;
delete pnPtr;
*pnPtr = 4;
cout<<*pnPtr;
}

Ans) 4当我尝试在visual studio 2010中执行时。

请解释一下4如何显示为输出?

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在对象销毁期间出现,当一个具有传入引用(指针)的对象被释放或取消分配时,而不修改指针的值 ,以便指针仍然指向解除分配的内存的内存位置。

假设系统将先前释放的内存重新分配给另一个进程,如果原始程序然后取消引用(现在)悬空指针,则可能导致不可预测的行为,因为内存现在可能完全包含不同的数据。如果程序将数据写入由悬空指针指向的内存中,则可能会导致无关数据的静默损坏,从而导致:

  1. 可能极难找到的微妙错误,或
  2. 导致细分错误
  3. 一般保护错误
  4. 因此,建议按如下方式重置释放/删除的指针:

    int main()
    {
     int *pnPtr = new int;
     delete pnPtr;
     pnPtr = null;
     // To-do Logic
     return 0;
    }
    

答案 3 :(得分:0)

delete不会更改指针的值,它会破坏int size内存关联,但如果没有重新分配则可以使用它。这种情况发生在你的情况下。