相关疑难解决方法(0)

Visual Studio对删除的指针做了什么?为什么?

我一直在阅读的C++书中指出,当使用delete操作符删除指针时,指向它的位置的内存被"释放"并且可以被覆盖.它还指出指针将继续指向同一位置,直到重新分配或设置为NULL.

但是在Visual Studio 2012中; 这似乎不是这样的!

例:

#include <iostream>

using namespace std;

int main()
{
    int* ptr = new int;
    cout << "ptr = " << ptr << endl;
    delete ptr;
    cout << "ptr = " << ptr << endl;

    system("pause");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我编译并运行该程序时,我得到以下输出:

ptr = 0050BC10
ptr = 00008123
Press any key to continue....
Run Code Online (Sandbox Code Playgroud)

显然,当调用delete时,指针指向的地址会发生变化!

为什么会这样?这是否与Visual Studio有关?

如果删除可以改变它指向的地址,为什么不删除自动设置指针NULL而不是一些随机地址?

c++ pointers memory-management delete-operator visual-studio-2012

127
推荐指数
4
解决办法
7979
查看次数

删除后在c ++中的指针

在阅读了很多关于此的帖子后,我想澄清下一点:

A* a = new A();
A* b = a;

delete a;

A* c = a; //illegal - I know it (in c++ 11)
A* d = b; //I suppose it's legal, is it true?
Run Code Online (Sandbox Code Playgroud)

所以问题是关于使用已删除指针的副本.

我读过,在c ++ 11中读取a导致未定义行为的价值 - 但是读取它的价值b呢?

尝试读取指针的值(注意:这与解除引用它不同)会导致自C++ 14以来的实现定义行为,其中可能包括生成运行时错误.(在C++ 11中它是未定义的行为) 删除后指针本身会发生什么?

c++ pointers c++11 c++14

12
推荐指数
2
解决办法
1484
查看次数