我正在用c ++做一些学习练习,我遇到了一个有趣的问题。拿这个示例程序。
#include <string>
#include <iostream>
char* pointer1;
void temp() {
char* s1 = new char;
*s1 = 'z';
pointer1 = s1;
std::cout << *pointer1 << std::endl;
for (int i = 0; i < 90000; i++) {
// Waste some processor time.
}
}
int main() {
temp();
std::cout << *pointer1 << std::endl;
delete pointer1;
//delete &pointer1;
std::cout << *pointer1 << std::endl;
return 0;
}
当你运行它时,打印出'z'两次然后打印一些随机垃圾。这是我的预期。如果你取消注释'delete&amp; pointer1'并注释掉第一个删除并运行程序,你会从输出中得到一个无效的指针错误。我假设这是删除地址,实际存储的内容仍然存在。
我的问题是当调用'delete pointer1'时它会删除'char * s1'还是只删除存储s1的地址?当调用'delete&amp; pointer1'时,地址被删除但是s1仍在内存中?
答案 0 :(得分:4)
pointer1
分配的地址已由new
分配。因此,在该地址上调用delete
是正确的,甚至是必要的。
但是,&pointer1
会为您提供存储pointer1
本身的地址。并且new
尚未分配此内存块。因此,在它上面调用delete
是完全违法的,这正是错误告诉你的。
所以,是的,delete pointer1
释放先前由new
分配的内存。但不,delete &pointer1
除了非法之外什么都不做。
此外,访问先前调用delete
的内存是未定义的行为。所以,你的第二个*pointer1
也不是你想要在你不想崩溃的程序中写的,更糟糕的是,这会给你带来不可预测的结果。