C ++删除指针

时间:2016-11-21 03:53:55

标签: c++ pointers

#include <iostream>
#include <string>
using namespace std;

int main() {
    string* pstr2 = new string;
    cout << "pointer pstr2: " << pstr2 << endl;

    delete pstr2;
    cout << "pointer pstr2 after deletion: " << pstr2 << endl;

    string* pstr = new string;
    pstr->push_back('a');
    cout << "pointer pstr: " << pstr << endl;
    cout << "*pstr: " << *pstr << endl;

    delete pstr;
    cout << "pointer pstr after deletion: " << pstr << endl;
    cout << "*pstr after deletion: " << *pstr << endl;
    return 0;
}

输出如下:

pointer pstr2: 0x7ffe00404d10
pointer pstr2 after deletion: 0x7ffe00404d10

pointer pstr: 0x7ffe00404d10
*pstr: a
pointer pstr after deletion: 0x7ffe00404d10
*pstr after deletion: a

问题:

  1. 我知道有一种做法是在删除指针后将动态指针设置为NULL。但是为什么pstr2仍然有有效的地址?

  2. 删除指针pstr释放内存,即“a”。但为什么* pstr的有效内容仍为“a”?

  3. 为什么pstr和pstr2具有相同的分配地址?我已多次运行代码。

1 个答案:

答案 0 :(得分:0)

  
      
  1. 我知道有一种做法是在删除指针后将动态指针设置为NULL。但为什么pstr2仍然有有效的地址?
  2.   

它没有“有效”地址。通过删除该地址的内存,您将其无效。地址不会改变,但分配给该地址的内存未被分配,可能随时被覆盖/删除。

  
      
  1. 删除指针pstr释放内存,即“a”。但为什么* pstr的有效内容仍为“a”?
  2.   

内容不是“有效”,它恰好没有改变。无法保证。删除内存不一定会改变其内容。它可能只是将其标记为可用于另一个变量。

  
      
  1. 为什么pstr和pstr2具有相同的分配地址?我已经多次运行代码了。
  2.   

这只是一个巧合。它不能保证永远是一样的。如果它是内存分配函数为特定编译器实现工作的方式的工件。