为了账号安全,请及时绑定邮箱和手机立即绑定

什么是悬空的指针?

什么是悬空的指针?

C++
LEATH 2019-06-24 17:06:03
什么是悬空的指针?我知道这是个很常见的问题,但对我来说还是新鲜的!我不明白悬挂指针的概念,在谷歌上搜索,并编写测试方法来找到一个。我只是想知道这是一个悬空的指针吗?无论我找到什么例子,都会返回一些东西,这里我正在尝试类似的东西!谢谢!void foo(const std::string name){     // will it be Dangling pointer?!, with comments/Answer     // it could be if in new_foo, I store name into Global.     // Why?! And what is safe then?     new_foo(name.c_str());}void new_foo(const char* name){     // print name or do something with name...   }
查看完整描述

3 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

悬挂指针是指向无效数据或不再有效的数据的指针,例如:

Class *object = new Class();Class *object2 = object;delete object;object = nullptr;// now object2 points to something which is not valid anymore

即使在堆栈分配对象中也可能发生这种情况:

Object *method() {
  Object object;
  return &object;}Object *object2 = method();// object2 points to an object which has been removed from stack after exiting the function

返回的指针c_str如果字符串随后被修改或销毁,则可能会变得无效。在您的示例中,您似乎没有修改它,但由于不清楚您将如何处理const char *name不可能知道你的代码本质上是安全的还是不安全的。

例如,如果您将指针存储在某个位置,然后相应的字符串被销毁,则指针将无效。如果你用const char *name就在.的范围内new_foo(例如,为了打印目的)指针将保持有效。


查看完整回答
反对 回复 2019-06-24
?
跃然一笑

TA贡献1826条经验 获得超6个赞

悬空指针是指向未分配(已经释放的)内存区域的(非空)指针。

考虑到字符串不是通过new_foo修改的,上述示例应该是正确的。


查看完整回答
反对 回复 2019-06-24
?
四季花海

TA贡献1811条经验 获得超5个赞

就风格而言,我将一个悬空的指针解释为“一个仍然存在的指针,即使它指向的对象不再存在”。

在您的例子中,指针name它所指向的对象存在的时间较短。所以它永远不会晃来晃去。

在普通的C+类中,指针在很短的时间内悬空,在析构函数中。那是因为delete语句在最后一个},而指针本身在最后一次停止存在。}..如果你不想担心这个,可以使用。unique_ptr<T>..这个T*指针将在unique_ptr::~unique_ptr破坏者,这是完全安全的。


查看完整回答
反对 回复 2019-06-24
  • 3 回答
  • 0 关注
  • 630 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信