什么是悬挂指针

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

我不明白晃来晃去的指针的概念,在Google上search,并写testing方法find一个…我只是想知道这是一个摇晃的指针? 无论我find什么样的例子,我都在尝试类似的东西! 谢谢!

void foo(const std::string name) { new_foo(name.c_str()); ///// 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? } void new_foo(const char* name) { ... print name or do something with name... } 

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

 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 

如果string被修改或被销毁,那么由c_str返回的指针可能会失效。 在你的例子中,你似乎没有修改它,但是由于不知道你要用const char *name做什么,所以不可能知道你的代码本身是安全的。

例如,如果您将指针存储在某处,然后相应的string被销毁,指针将变为无效。 如果您在new_foo的作用域内使用const char *name (例如,为了打印目的),则指针将保持有效。

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

上面的例子应该是正确的,因为string没有通过new_foo修改。

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

在你的情况下,指针的name存在一个更短的时间,它指向的对象。 所以它永远不会晃来晃去

在常见的C ++类中,指针在一个非常短的时间内在析构函数中晃动。 这是因为delete语句在析构函数的最后} ,而指针本身在最后}不再存在。 如果你不想担心这个,使用例如unique_ptr<T>T*指针会在unique_ptr::~unique_ptr析构函数中unique_ptr::~unique_ptr很短的时间,这非常安全。

从这里采取。 虽然,即使这是C,对于C ++来说也是一样的。

摇摇欲坠的指针

如果任何指针指向任何variables的内存地址,但在指针仍然指向这样的内存位置之后,某个variables已从该内存位置删除之后。 这样的指针被称为悬挂指针,这个问题被称为悬挂指针问题。

原来

在这里输入图像描述

后来

在这里输入图像描述

 #include<stdio.h> int *call(); int main(){ int *ptr; ptr=call(); fflush(stdin); printf("%d",*ptr); return 0; } int * call(){ int x=25; ++x; return &x; } 

它的输出将是垃圾,因为variablesx是局部variables。 它的范围和生命周期在函数调用之内,因此xvariablesx的返回地址变为死后,指针仍然指向ptr仍然指向该位置。

悬挂指针和悬挂指针的问题如果任何指针指向任何variables的内存地址,但某些variables已从该内存位置删除,而指针仍然指向这样的内存位置。

该指针被称为悬挂指针,当时出现的问题称为悬挂指针问题。

这里有一些例子: 悬挂指针和悬挂指针的问题