删除ptr C ++后会发生什么

时间:2019-02-13 05:42:37

标签: c++ pointers printing delete-operator dangling-pointer

我尝试使用以下代码示例删除ptr:

int* data = new int(1);

int* p = NULL; 

p = data;

*p = 3;

delete p;

// Prints 3
cout << *p << endl;

//Prints 3    
cout << *data << endl;
  

最后两行代码显示3,我的问题是   在delete p之后删除?根据它从打印出来的   最后两行代码,似乎什么都没有删除0.0 ~~

有人请向我解释。谢谢大家。

3 个答案:

答案 0 :(得分:3)

delete对象之后取消引用指针是导致未定义行为的原因。不要指望任何可预测的行为并避免这种行为。

由于悬空的角度和不确定的行为而导致的悬空指针异常读取:Can a local variable's memory be accessed outside its scope?

答案 1 :(得分:1)

标准未定义会发生什么。就C ++而言,该地址无效,不应使用。如果您仍然使用它,将会发生什么,这是任何人的猜测。

实际上,该内存通常位于那里,直到有其他需求为止。您所做的一切都会说:“我不再需要它了。”之后,您仍然可以访问它一段时间,从而使您对代码的适用性做出非常糟糕的假设,但是可以随时对其进行回收和重新分配。

如果该进程需要内存来存储其他内容,则可能会得到data所指向的内容。在这种情况下,使用data可能会破坏程序另一部分使用的内存。这是一个非常糟糕的场景,因为当与该错误完全无关的某件事导致程序崩溃时,很难跟踪发生了什么。

如果另一个进程需要内存,则底层系统可能会收回内存并将其提供给另一个进程。在现代PC上,在将内存分配给其他进程之后访问data将是致命的。

答案 2 :(得分:0)

  

delete p之后删除了什么?

new运算符从空闲存储区中分配内存,而delete运算符将其取消分配(标记为未使用,供以后的new调用进行分配)。因此,在delete p中,内存被取消分配或标记为未使用,可用于以后的分配。

  

根据最后两行代码显示的内容,似乎没有删除任何内容

您要在delete语句后取消引用指针,这是未定义的行为。这意味着当取消引用无效的指针时,您将无法预测结果。