悬空指针和删除命令C++
Danglings Pointers and Delete Command in C++
我注意到我的C++代码中有一些非常奇怪的东西。
class A
{
public:
void doIt(){cout<<"hello"<<endl;}
};
int main() {
A* a=new A();
A* b=a;
delete a;
b->doIt();
return 0;
}
我以为delete
会从堆中删除内存,b->doIt()
会失败。但是在运行此代码时它可以工作,甚至可以打印"hello"。
为什么?
我以为删除会从堆中删除内存
"擦除"记忆的唯一方法是用锤子。
内存被标记为"未使用",对象在语义上被销毁。
b->doIt()
会失败
这是为什么呢?
没有适当的机制可以为您执行此操作,在一般情况下也不可能有机制。
你有责任不对不存在的对象调用函数。
实际上,它不会在这里崩溃,因为doIt
中的任何内容实际上都没有尝试访问对象的内存。请记住,函数不是存储在对象"中"的 - 它是程序的一部分,并且程序仍然存在。
即使doIt
访问和/或更改了对象的状态,只要该内存仍在活动页面中,您仍然可能不会崩溃。这正是为什么未定义的行为被定义为不可预测的原因。
避免。
- 类似:可以在其范围之外访问局部变量的内存吗?
这很可能是因为doIt
方法不使用 A 类的任何内部状态。 因此,编译器可能将其优化为静态方法,并在静态类上下文中调用调用。指针悬空的事实不会阻止该方法的运行。
但是,这是未定义的行为,更严格的编译器实际上可能会生成确实失败的代码。
相关文章:
- 从命令行c++发送文本文件名
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 使用QProcess执行命令,并将结果存储在QStringList中
- 数组长度,为什么从命令行获取时不能使用它?
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- clang整洁10忽略了我的NOLINT命令
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 如何使用ESP8266向谷歌主页发送命令
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 通过 Openssl 命令行加密,通过 c++ 解密
- CMake "--target install"无需"--build"命令行
- Gstreamer 管道从命令 lne 到 c 代码
- 自动"yes"到 Popen SSH 命令
- 更改命令行 qt5 源代码构建配置的正确/快速方法