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?),可以提出一个例子,但您的答案需要澄清。谢谢