c++11 - 指向堆栈内存的指针
问题描述
class object
{
public:
object(){}
~object(){}
};
int main()
{
object *p = NULL;
{
object a;
p = &a;
if(p){
cout << "not NULL\n";
}
else{
cout << "NULL ptr\n";
}
}
if(p){
cout << "not NULL\n";
}
else{
cout << "NULL ptr\n";
}
return 1;
}
结果:
非空非空
我不知道为什么会出现这个结果,我认为它是“not NULL”和“NULL”。什么时候object
调用了析构函数,然后p
指向什么?堆栈内存是如何工作的?
解决方案
当a
被销毁时,p
成为一个悬空指针。它是一个不为空的指针,但仍为取消引用它的未定义行为。
那是因为一个垂死的对象不会开始改变程序中各处的值。如果程序中到处都有一百个指向垂死对象的指针,会发生什么?您不能只是将它们的所有值都更改为nullptr
神奇的值。如果您希望这些指针变为nullptr
,则必须自己影响这些值。
推荐阅读
- amazon-web-services - 在我的设备池中哪里可以找到 Amazon 资源编号 (ARN)?
- java - 任务:react-native-gesture-handler:compileDebugJavaWithJavac FAILED
- r - 结构主题建模 (STM):减少 R 中的主题数量
- spring-cloud-dataflow - 如何使用 microk8s 注册 SCDF 应用程序?
- oracle - liquibase 不会在 Oracle DB 12c 上创建 autoIncrement 列
- sql - 有没有办法为 SQL 未发生的订单创建行?
- elasticsearch - 带连字符的 elasticsearch 查询字符串
- python - 使用 Pandas 删除重复项并匹配 2 个 csv 文件的行元素
- firebase - 我的 Nuxt 静态网站的某些页面未显示在 firebase 主机上
- bash - 如何按名称找到匹配的远程分支?