Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我在VisualStudio2010中运行代码后得到4作为输出 intmain() { int*pnPtr=新的int; 删除pnPtr; *pnPtr=4; cout_C++_Visual Studio 2010 - Fatal编程技术网

C++ 为什么我在VisualStudio2010中运行代码后得到4作为输出 intmain() { int*pnPtr=新的int; 删除pnPtr; *pnPtr=4; cout

C++ 为什么我在VisualStudio2010中运行代码后得到4作为输出 intmain() { int*pnPtr=新的int; 删除pnPtr; *pnPtr=4; cout,c++,visual-studio-2010,C++,Visual Studio 2010,指针pnPtr仍然指向内存中的某个地方,调用delete不会更改pnPtr本身的值。内存不再分配给进程。指针pnPtr仍然指向内存中的某个地方,调用delete不会更改的值ode>pnPtr本身。内存不再分配给您的进程。您希望它返回什么 请理解,delete只释放指向的已分配内存,但指针保持原样。您仍然可以使用指针对指向的地址执行某些操作 int main() { int *pnPtr = new int; delete pnPtr; *pnPtr = 4; cout<<*pnPtr

指针
pnPtr
仍然指向内存中的某个地方,调用
delete
不会更改
pnPtr
本身的值。内存不再分配给进程。

指针
pnPtr
仍然指向内存中的某个地方,调用
delete
不会更改的值ode>pnPtr本身。内存不再分配给您的进程。

您希望它返回什么

请理解,delete只释放指向的已分配内存,但指针保持原样。您仍然可以使用指针对指向的地址执行某些操作

int main()
{
int *pnPtr = new int;
delete pnPtr;
*pnPtr = 4;
cout<<*pnPtr;
}
intmain()
{
int*pnPtr=newint;//分配内存,pnPtr现在指向它
delete pnPtr;//删除分配的内存,pnPtr仍然指向该位置
*pnPtr=4;//将指向地址处的内存设置为4

你能想象它会回来吗

请理解,delete只释放指向的已分配内存,但指针保持原样。您仍然可以使用指针对指向的地址执行某些操作

int main()
{
int *pnPtr = new int;
delete pnPtr;
*pnPtr = 4;
cout<<*pnPtr;
}
intmain()
{
int*pnPtr=newint;//分配内存,pnPtr现在指向它
delete pnPtr;//删除分配的内存,pnPtr仍然指向该位置
*pnPtr=4;//将指向地址处的内存设置为4

cout问题是由于对象销毁过程中出现的
悬空指针
,当释放或取消分配具有传入引用(指针)的对象时,而不修改指针的值,因此指针仍然指向取消分配的内存的内存位置

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

  • 极难发现的细微缺陷,或
  • 导致分段故障或
  • 一般保护故障
  • 因此,建议按如下方式重置释放/删除的指针:

    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;
    }
    

    问题是由于对象销毁过程中出现的悬空指针
    ,当具有传入引用(指针)的对象被释放或取消分配时,没有修改指针的值,因此指针仍然指向取消分配内存的内存位置

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

  • 极难发现的细微缺陷,或
  • 导致分段故障或
  • 一般保护故障
  • 因此,建议按如下方式重置释放/删除的指针:

    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;
    }
    

    delete不会更改指针的值,它会破坏int-size内存关联,但如果未重新分配,则可以使用。在您的情况下就是这样。

    delete不会更改指针的值,它会破坏int-size内存关联,但如果未重新分配,则可以使用。这在您身上发生过r案例。

    它可以显示任何内容,甚至可能导致,请了解和阅读。感谢您的回答:)@sandeep提供的答案之一可以解决您的理解问题吗?如果可以,如果您接受了,那就太好了:)它可以显示任何内容,甚至可能导致,请了解和阅读。感谢您的回答:)@sandeep提供的答案中有一个能解决你的理解问题吗?如果是这样,如果你接受了一个答案就太好了:)谢谢你的答案:)谢谢你的答案:)