C++ 删除ptr C++;

C++ 删除ptr C++;,c++,pointers,printing,delete-operator,dangling-pointer,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; int*data=newint(1); int*p=NULL; p=数据; *p=3; 删除p; //印刷品3 无法在删除对象

我尝试使用以下代码示例删除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;
int*data=newint(1);
int*p=NULL;
p=数据;
*p=3;
删除p;
//印刷品3

无法在删除对象后取消对指针的引用对象是导致未定义行为的原因。不要指望任何可预测的行为,并避免它


由于不同的角度和未定义的行为而导致悬空指针异常读取:

在执行
删除
d操作后取消对指针的引用对象是未定义行为的原因。不要指望任何可预测的行为,并避免它


由于不同的角度和未定义的行为导致悬空指针异常读取:

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

在实践中,这种记忆通常会一直存在,直到其他东西需要它。您所做的只是说,“我不再需要它了。”之后您仍然可以访问它一段时间,这会导致您对代码的适用性做出非常糟糕的假设,但它可以随时回收和重新分配

如果进程需要内存来处理其他内容,那么它可能会得到
数据所指向的内容。在这种情况下,使用
数据
可能会损坏程序另一部分使用的内存。这是一个非常糟糕的场景,因为当与bug完全无关的东西使程序崩溃时,很难追踪到底发生了什么


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

标准没有定义会发生什么。就C++而言,地址无效,不应该使用。如果你使用它会发生什么是任何人的猜测

在实践中,这种记忆通常会一直存在,直到其他东西需要它。您所做的只是说,“我不再需要它了。”之后您仍然可以访问它一段时间,这会导致您对代码的适用性做出非常糟糕的假设,但它可以随时回收和重新分配

如果进程需要内存来处理其他内容,那么它可能会得到
数据所指向的内容。在这种情况下,使用
数据
可能会损坏程序另一部分使用的内存。这是一个非常糟糕的场景,因为当与bug完全无关的东西使程序崩溃时,很难追踪到底发生了什么


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

标准没有定义会发生什么。就C++而言,地址无效,不应该使用。如果您仍然使用它会发生什么是任何人的猜测。通常情况下,指针指向的内存块会添加回进程的可用内存列表中,这意味着它可能会通过以后调用
new
/
malloc()分发给进程中的其他代码
/等。在删除调用后读取或写入该内存是不安全的(这两个原因都是因为其他线程可能已经在重用它,更正式的原因是它调用了未定义的行为,这意味着编译器可以自由地假设您永远不会这样做,因此如果您这样做,可能会很高兴地允许奇怪/不愉快/神秘的事情发生)一旦你删除了一个指针,用它来做任何事情都会导致鼻涕虫。我听说C++会很痛苦。但是有些人甚至没有注意到它们,直到有一天他们因为没有明显的原因而生气,用他们的小叉子刺鼻子。地址无效,不应使用。如果您仍然使用它,会发生什么情况是任何人的猜测。通常情况下,指针指向的内存块会添加回进程的可用内存列表中,这意味着它可能会通过以后调用
new
/
malloc()分发给进程中的其他代码
/等。在删除调用后读取或写入该内存是不安全的(这两个原因都是因为其他线程可能已经在重用它,更正式的原因是它调用了未定义的行为,这意味着编译器可以自由地假设您永远不会这样做,因此如果您这样做,可能会很高兴地允许奇怪/不愉快/神秘的事情发生)一旦你删除了一个指针,用它做任何事情都会导致鼻魔。我听说这会很痛苦。但有些人甚至没有注意到它们,直到有一天他们无缘无故地生气,用他们的小干草叉刺穿你的鼻子。然后
p
数据
都变得“不可预测”或者只有“p”本身变得“不可预测”?“变得
不可预测或可预测”是什么意思?@Mocha,你不应该去引用这些变量中的任何一个。然后它只会打印出那些指针的内存地址~@Mocha,我没有跟随那个注释。好的,我明白了。因为它将被标记为“未使用”内存。人们不会在“删除”之后尝试使用它。那么我可以安全地说,当我
delete p
时,
p
的内存地址被标记为未使用。数据的内存地址没有被标记为未使用。然后
p
data
都变得“不可预测”或者只有“p”本身变得“不可预测”?“变得
不可预测或可预测”是什么意思?@Mocha,你不应该去引用这些变量中的任何一个。然后它只会打印出这些点的内存地址