c ++使用指针删除创建范围之外的对象?
c++ delete object outside of creation scope with pointer?
我正在用 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' 两次然后一些 运行dom 垃圾。这是我所期望的。如果您取消注释 'delete &pointer1' 并注释掉第一个 delete 和 运行 程序,您会从输出中得到一个无效指针错误。我假设这是在删除地址,而实际存储在那里的内容仍然存在。
我的问题是调用 'delete pointer1' 时它会删除 'char* s1' 还是只删除存储 s1 的地址?调用时'delete &pointer1'是不是地址被删除了,s1还在内存中?
pointer1
指向的地址已被new
分配。因此,在该地址上调用 delete
是正确的,甚至是必要的。
但是,&pointer1
为您提供了存储 pointer1
本身的地址。而这个内存块还没有被new
分配过。因此,在其上调用 delete
是绝对非法的,这正是错误告诉您的内容。
所以,是的,delete pointer1
释放了之前由 new
分配的内存。但是不,delete &pointer1
除了违法什么都不做。
此外,访问您之前调用 delete
的内存是未定义的行为。因此,您的第二个 *pointer1
也不是您想在程序中编写的任何东西,您不想崩溃,或者更糟糕的是,这会给您带来不可预知的结果。
我正在用 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' 两次然后一些 运行dom 垃圾。这是我所期望的。如果您取消注释 'delete &pointer1' 并注释掉第一个 delete 和 运行 程序,您会从输出中得到一个无效指针错误。我假设这是在删除地址,而实际存储在那里的内容仍然存在。
我的问题是调用 'delete pointer1' 时它会删除 'char* s1' 还是只删除存储 s1 的地址?调用时'delete &pointer1'是不是地址被删除了,s1还在内存中?
pointer1
指向的地址已被new
分配。因此,在该地址上调用 delete
是正确的,甚至是必要的。
但是,&pointer1
为您提供了存储 pointer1
本身的地址。而这个内存块还没有被new
分配过。因此,在其上调用 delete
是绝对非法的,这正是错误告诉您的内容。
所以,是的,delete pointer1
释放了之前由 new
分配的内存。但是不,delete &pointer1
除了违法什么都不做。
此外,访问您之前调用 delete
的内存是未定义的行为。因此,您的第二个 *pointer1
也不是您想在程序中编写的任何东西,您不想崩溃,或者更糟糕的是,这会给您带来不可预知的结果。