C ++ - 运算符删除混淆

时间:2011-01-27 21:35:11

标签: c++

我正在学习C ++,并且是删除操作符的新手。从代码中可以看出,我将删除运算符应用于new运算符(m)。应用它之后,我仍然可以使用指针并为其指定一个新值。我没有收到任何编译器错误。根据我的阅读,我应该在应用删除后使用新指针,因为指针不指向任何东西。欢迎任何帮助。谢谢。

 int main()
    {
        int* m;
        m = new int;
        *m = 14;
        cout << *m << " ";
        delete m;
        *m = 12;
        cout << *m;
    }

控制台输出

14 12

5 个答案:

答案 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)。