c++ - c++ 用指针删除创建范围之外的对象?
问题描述
我正在用 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
已由 分配new
。因此,调用delete
该地址是正确的,甚至是必要的。
但是,&pointer1
为您提供pointer1
存储自身的地址。并且这个内存块还没有被分配new
。因此,调用它是绝对非法的delete
,这正是错误告诉你的。
所以,是的,delete pointer1
释放new
之前分配的内存。但是不,delete &pointer1
除了违法之外什么都做不了。
此外,访问您之前调用的内存delete
是未定义的行为。所以,你的第二个*pointer1
也不是你想在一个你不想崩溃的程序中写的东西,或者更糟糕的是,它会给你带来不可预测的结果。
推荐阅读
- amazon-web-services - 如何修复错误在使用 Amazon 的 S3 和 Cloudfront 时,请求的资源上不存在“Access-Control-Allow-Origin”标头
- google-cloud-platform - 云数据融合上次运行时间作为参数
- javascript - 如何通过 jquery 使用平滑滚动并使用类?
- excel - 将 SEQUENCE 作为输入传递给 SEQUENCE 公式的 rows 参数
- java - 有没有其他方法可以解决这个问题?
- linux - 如何在linux中将当前目录设为主目录
- java - 使用 PostgreSQL 'crypt()' 函数选择为布尔值
- javascript - 如何在 Mongoose 中确定模型所属的集合
- android - 如何在android bt堆栈中禁用旧版配对
- postgresql - Gorm 自动迁移创建没有用户定义属性的表(postgresql)