如果我delete
指针如下:
delete myPointer;
然后,不将0
分配给指针,如下所示:
myPointer = 0; //skipped this
myPointer
会指向另一个内存地址吗?
答案 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限定符以确保地址不变。