这段代码会阻止悬空指针吗?

时间:2011-03-09 19:41:40

标签: c++ pointers

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
}

3 个答案:

答案 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不同。