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

C++ 在C+中对地址应用删除运算符后,地址会发生什么变化+;?,c++,pointers,delete-operator,C++,Pointers,Delete Operator,如果我删除指针,例如: delete myPointer; 在这之后,not将0分配给指针,如下所示: myPointer = 0; //skipped this myPointer是否会指向另一个内存地址?否,在大多数实现中,它将存储与以前相同的地址-delete通常不会更改地址,除非您指定新的地址值,否则它将保持不变。不过 不要忘记,对于已经删除的d指针是未定义的行为-否则您的程序可能会崩溃或行为异常。myPointer将指向相同的内存地址。但是,您使用该地址的内存是无效的,因为dele

如果我
删除
指针,例如:

delete myPointer;
在这之后,not
0
分配给指针,如下所示:

myPointer = 0; //skipped this

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

否,在大多数实现中,它将存储与以前相同的地址-
delete
通常不会更改地址,除非您指定新的地址值,否则它将保持不变。不过


不要忘记,对于已经删除的
d指针是未定义的行为-否则您的程序可能会崩溃或行为异常。

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

明确地说,否。
delete
操作不会更改指针本身-它会释放该指针寻址的内存。

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

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上失败,因此我更改了第二个函数中的操作顺序


然而,问题是好的,问题是存在的。有经验的工程师应该意识到这一点。

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

@user588855:根据情况,将
0
分配给删除的指针是一个有争议的话题,因为它可能会隐藏流/内存处理中的结构错误。最好使用智能指针/容器,而不必调用
delete
。那么,我可以使用它指向(分配)的相同地址的已删除指针吗?指针一旦被删除,是否会立即返回到操作系统(例如,或其他原因?@user588855:可能它会返回到操作系统,可能不会,可能是其他代码(在另一个线程上)请求内存并在该地址获取内存。不管发生什么,这都会给你带来很大的痛苦-不要这样做,正确使用指针和动态内存分配。指针永远不会返回给操作系统。相反,指针指向的内存块会返回给操作系统。您不删除指针,而是删除指针指向的内存
delete x
允许更改
x
的值:我不确定“无错误”是什么意思。你是说你在访问无效内存时没有出错吗?或者操作访问了释放的内存,这是无效的,但没有根据测试标记无效的结果?或者您是说您将表的所有权转移给了客户?答案并不清楚。此外,最好使用智能指针(如前面的评论所述)。当智能指针不可用时(直接的C?),可以提出一个例子,但您的答案需要澄清。谢谢