void _this()
{
string a = "i am a"; // original value of variable a
string* modifier = NULL; //pointer is declared 0x0000...
modifier = &a; // 0x0000 -> 0x0a //modifier stores the address of a
*modifier = "modified"; // 0x0a + 0x0modified... //modifier assigns "modified" to the address of a;
cout << a << endl << modifier<<"\n"; //shows "modified" + the address of modifier in memory
modifier = NULL; // the pointer(modifier...) now points to nothing....is it no longer "dangling"???
cout << modifier; // shows only zeros...000000000
}
答案 0 :(得分:3)
我假设你使用的是C ++而不是C,当你说字符串时,你的意思是::std::string
。
上面的代码中没有显示内存泄漏。
此外,只有当对象超出范围或被删除时,悬空指针才真正重要。你在这里做的都不是。
答案 1 :(得分:2)
悬空指针是指向无效内存的指针(不是NULL)。通常与最初指向有效内存的指针相关联。
int x = new int(4); // x valid;
delete x; // x is now dangling.
// It points at memory that does not belong to application
x = NULL; // x is not dangling.
在原始示例中,指针永远不会悬挂,因为它指向一个始终有效的自动变量(当修饰符有效时)。虽然如果你从函数返回修改结果,它会悬挂(如果你没有指定NULL)。
在删除它之后为指针指定NULL在C中非常重要。但是在C ++中没有那么多,因为你的指针应该被封装在一个类中,以便它在使用完成时不再可用。
std::string data; // There is a pointer inside here.
// No need to set it to NULL. The destructor handles all that.
答案 2 :(得分:0)
代码中没有悬空指针。在几行上,左手(第一)注释是错误的,而第二条注释是正确的。例如//0x0000 -> 0x0a //modifier stores the address of a
:在该行之后,modifier
保存变量a
的地址,该地址几乎肯定与实际地址0x0a
不同。