什么是悬空的指针?

什么是悬空的指针?

我知道这是个很常见的问题,但对我来说还是新鲜的!

我不明白悬挂指针的概念,在谷歌上搜索,并编写测试方法来找到一个。

我只是想知道这是一个悬空的指针吗?无论我找到什么例子,都会返回一些东西,这里我正在尝试类似的东西!

谢谢!

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...   }


LEATH
浏览 631回答 3
3回答

DIEA

悬挂指针是指向无效数据或不再有效的数据的指针,例如: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(例如,为了打印目的)指针将保持有效。

跃然一笑

悬空指针是指向未分配(已经释放的)内存区域的(非空)指针。考虑到字符串不是通过new_foo修改的,上述示例应该是正确的。

四季花海

就风格而言,我将一个悬空的指针解释为“一个仍然存在的指针,即使它指向的对象不再存在”。在您的例子中,指针name它所指向的对象存在的时间较短。所以它永远不会晃来晃去。在普通的C+类中,指针在很短的时间内悬空,在析构函数中。那是因为delete语句在最后一个},而指针本身在最后一次停止存在。}..如果你不想担心这个,可以使用。unique_ptr<T>..这个T*指针将在unique_ptr::~unique_ptr破坏者,这是完全安全的。
打开App,查看更多内容
随时随地看视频慕课网APP