为什么这样做?删除后为指针分配新的int值

时间:2015-05-21 17:55:00

标签: c++ pointers c++11 memory dynamic

我有这段代码:

#include <iostream>

using namespace std;

void main(){
    int *ptr = new int(15);

    cout << "Address of ptr: " << ptr << endl;
    cout << "Content of ptr: " << *ptr << endl << endl;

    delete ptr;
    *ptr = 30;

    cout << "Address of ptr: " << ptr << endl;
    cout << "Content of ptr: " << *ptr << endl;
}

这是输出:

Address of ptr: 007B81F0
Content of ptr: 15

Address of ptr: 007B81F0
Content of ptr: 30

为什么这样做?为什么我仍然可以使用指针?发生了什么事?

这在某些方面有用吗?

3 个答案:

答案 0 :(得分:11)

这是典型的未定义行为,它恰好起作用,因为先前为*ptr分配的内存尚未被操作系统*回收。你永远不应该依赖这种代码。

请注意,指针的地址保持不变,因为C ++运行时不会使指针无效(这需要时间,在C ++中你不需要为不需要的东西付费)。

*另见Remy Lebeau的评论如下。

答案 1 :(得分:0)

正如vsoftco解释的那样,操作系统尚未回收内存。现在,如果我们执行类似下面的操作,您可能会遇到完全不同的输出:

int *ptr = new int(15);

cout << "Address of ptr: " << ptr << endl;
cout << "Content of ptr: " << *ptr << endl << endl;
delete ptr;

int *ptr2 = new int(15); // making a new ptr to use memory.
*ptr = 30;               // <- OPS!
delete ptr2;             // deleting new ptr.

cout << "Address of ptr: " << ptr << endl;
cout << "Content of ptr: " << *ptr << endl;

无论如何,结果是未定义的行为

答案 2 :(得分:-3)

虽然使用了删除关键字但由于某种原因没有发生指针的解除分配。(可能指针的范围仍在使用中)

使用指针是C ++的一个重要方面。使用指针处理引用级别或内存地址非常重要。