删除运算符在C ++中应用后,地址会发生什么变化?

时间:2011-02-14 09:17:13

标签: c++ pointers delete-operator

如果我delete指针如下:

delete myPointer;

然后,0分配给指针,如下所示:

myPointer = 0; //skipped this

myPointer会指向另一个内存地址吗?

5 个答案:

答案 0 :(得分:18)

不,在大多数实现中,它将存储与先前相同的地址 - delete通常不会更改地址,除非您分配新地址值,否则它将保持不变。但是this is not always guaranteed

不要忘记,doing anything except assigning a null pointer or another valid pointer已经delete d指针是未定义的行为 - 您的程序可能会崩溃或行为异常。

答案 1 :(得分:5)

myPointer将指向相同的内存地址。但是,使用该地址的内存对你来说是无效的,因为delete会将它返回给运行时/操作系统,而操作系统我已分配该内存供其他人使用。

答案 2 :(得分:3)

绝对不是。 delete操作不会更改指针本身 - 它会释放该指针所寻址的内存。

答案 3 :(得分:0)

这个问题很重要!我已经看到Visual Studio 2017在“删除”之后更改了指针值。它引起了一个问题,因为我使用了内存跟踪工具。该工具在每个操作员“新建”之后收集指针,并在“删除”之后检查它们。伪代码:

Data* New(const size_t count)
{
    Data* const ptr(new Data[count]);
    #ifdef TEST_MODE
    MemoryDebug.CollectPointer(ptr);
    #endif
    return ptr;
}

void Delete(Data* const ptr)
{
    delete[] ptr;
    #ifdef TEST_MODE
    MemoryDebug.CheckPointer(ptr);
    #endif
}

此代码在Visual Studio 2008上运行良好,但在Visual Studio 2017上失败,因此我更改了第二个功能的操作顺序。

但是,问题很好,并且存在问题。经验丰富的工程师应该意识到这一点。

答案 4 :(得分:0)

并非总是如此,但是它可以改变。在设计哈希表时,我发现在对1000个对象进行约30次无错误测试后,地址已更改。删除操作后,它完全改变了。解决方案:使用T_ * const将边地址存储到要删除的对象中,其中T_是指针类型,使用const限定符以确保地址不变。