什么是悬挂指针
我知道这是很常见的问题,但对我来说还是新的!
我不明白晃来晃去的指针的概念,在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已从该内存位置删除,而指针仍然指向这样的内存位置。
该指针被称为悬挂指针,当时出现的问题称为悬挂指针问题。
这里有一些例子: 悬挂指针和悬挂指针的问题