我尝试使用以下代码示例删除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 ~~
有人请向我解释。谢谢大家。
答案 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
语句后取消引用指针,这是未定义的行为。这意味着当取消引用无效的指针时,您将无法预测结果。