#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
问题:
我知道有一种做法是在删除指针后将动态指针设置为NULL。但是为什么pstr2仍然有有效的地址?
删除指针pstr释放内存,即“a”。但为什么* pstr的有效内容仍为“a”?
为什么pstr和pstr2具有相同的分配地址?我已多次运行代码。
答案 0 :(得分:0)
- 我知道有一种做法是在删除指针后将动态指针设置为NULL。但为什么pstr2仍然有有效的地址?
醇>
它没有“有效”地址。通过删除该地址的内存,您将其无效。地址不会改变,但分配给该地址的内存未被分配,可能随时被覆盖/删除。
- 删除指针pstr释放内存,即“a”。但为什么* pstr的有效内容仍为“a”?
醇>
内容不是“有效”,它恰好没有改变。无法保证。删除内存不一定会改变其内容。它可能只是将其标记为可用于另一个变量。
- 为什么pstr和pstr2具有相同的分配地址?我已经多次运行代码了。
醇>
这只是一个巧合。它不能保证永远是一样的。如果它是内存分配函数为特定编译器实现工作的方式的工件。