【发布时间】:2018-06-11 22:50:39
【问题描述】:
我正在用 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 &pointer1' 并注释掉第一个删除并运行程序,您会从输出中得到一个无效的指针错误。我假设这是删除地址,而实际存储的地址仍然存在。
我的问题是,当调用“delete pointer1”时,它会删除“char* s1”还是只是存储 s1 的地址?当调用 'delete &pointer1' 时,地址是否被删除但 s1 仍在内存中?
【问题讨论】:
-
您完全是在问错误的问题。对于初学者根本和其他任何人在处理写得不好的(遗留)代码时,这些都不重要。专注于从一本好书和最新的书中学习语言,不要在反复试验中浪费宝贵的时间。无论如何,结果往往毫无意义。
-
*pointer1在delete pointer1;之后是UB,delete &pointer1;也是UB。 -
使用已删除指针的值是一种未定义的行为,因此这里没有预期的结果。
-
我回应 @BaummitAugen 的评论。今天的语言学习者几乎不应该使用
new和delete;使用标准容器和共享/唯一指针和make_shared/make_unique。 -
@BaummitAugen 这就是我不经常使用堆栈溢出的原因。有人说我想学A。然后人们出来说“不,你不想学A而是学B,或者干脆忘记A”。这个地方的人太多,阻碍了其他人学习。
标签: c++ pointers scope memory-address