我正在学习C ++,并且是删除操作符的新手。从代码中可以看出,我将删除运算符应用于new运算符(m)。应用它之后,我仍然可以使用指针并为其指定一个新值。我没有收到任何编译器错误。根据我的阅读,我应该在应用删除后使用新指针,因为指针不指向任何东西。欢迎任何帮助。谢谢。
int main()
{
int* m;
m = new int;
*m = 14;
cout << *m << " ";
delete m;
*m = 12;
cout << *m;
}
控制台输出
14 12
答案 0 :(得分:8)
删除操作符有点微妙。当你写
delete m;
此代码的含义是“回收m
指向的内存”。换句话说,它确实不对指针m
执行任何操作,而是指向对象m
。例如,在此图中:
+-----+
m --> | 137 |
+-----+
指针m
指向一个值为13的整数。如果写delete m
,则回收内存137
,但m
本身不受影响。您可以将其重新指定为指向其他对象,或指向NULL
,但您不应继续引用它用于指向的值,因为它不再存在。
答案 1 :(得分:2)
编译器不检查这个。像lint这样的工具检查这个。是的,有时您可以使用已删除的内存,但它是未定义的行为。内存不再属于您,因此您可能会冒着写程序中另一个对象使用的内存的风险。这只是因为你的程序非常简单,不会发生这种情况。
答案 2 :(得分:2)
没错,你的代码不正确。
在delete m;
之后,指针m
不再指向内存中的有效int
变量。因此,无论何时在此之后取消引用此指针,您都会得到未定义的行为 - 您的程序将以不可预测的方式运行,可能会导致错误。
BTW-一些编译器通过填充具有特征值的“已删除”值(不是指针)来帮助您在代码中找到此类错误,例如0xFEEEFEEE
。这允许您在调试期间注意到您正在尝试使用指向已删除内存的指针。
答案 3 :(得分:1)
调用delete m
后,m
过去指向的内存已被释放,系统可能会重新分配。但是,m
仍然指向该位置,这意味着如果您选择再次使用/取消引用它,则可能获取您想要的值。你可能不会。这是未定义的行为。
答案 4 :(得分:0)
删除后使用指针是“未定义”。它可能会奏效。它可能不会。这几乎肯定是一件非常糟糕的事情(tm)。