我们是否必须将一个不指向动态分配内存的指针设置为空?

Joh*_*cia -1 c++ pointers

我很好奇,想知道即使在程序结束后,指针是否仍会指向某个地址。

有人告诉我,在释放内存后,我们应该始终将指针设置为 null,如下所示:

int* num = new int(2);

// do something with num

delete num;
num = nullptr;
Run Code Online (Sandbox Code Playgroud)

但是,如果我的指针没有指向动态内存中的地址,而是指向堆栈中的公共地址,例如:

int num = 2;
int* pnum = #

// do something with pnum
Run Code Online (Sandbox Code Playgroud)

那么我是否也应该将指针设置为空?因为我不想让它继续指向一个地址

pnum = nullptr;
Run Code Online (Sandbox Code Playgroud)

如果我不将其设置为 null,一旦我的程序运行完毕,它仍然会指向该地址吗?

我被教导在动态内存用例中始终将指针设置为空,但是指向公共堆栈内存地址的指针又如何呢?

伊迪丝感谢评论中所有情绪激动的人,是的,我是一个 20 岁的菜鸟,还在学习,是的,你太聪明了,没有人能对付你的智商,因为你太聪明了哈哈哈。不要再嘲笑我或其他试图提供帮助的人。对于所有给出简单逻辑解释的人,我很感激。

Sha*_*ger 5

在任何一种情况下,您都不需要指针设置为 null 。您这样做只是作为一种安全机制,因此您稍后不会意外地尝试读取无效指针(如果指针为空,并且您尝试使用它,您会很快死掉并看到问题,如果它指向释放或以其他方式不再有效的内存,访问可能会意外“工作”),如果再次访问也不会造成损坏(调用空指针是合法的无操作,但在任何其他指针上调用它两次会很糟糕事物)。deletedelete

基本上,如果您像这样进行防御性编程,并且指针变量可能比它所指向的内容更长寿(例如,指针位于全局内存中,并且您给它一个堆栈变量的地址,该堆栈变量将在函数返回时消失),当然,将其归零。否则,保留它填充并没有危险,并且在特定情况下显式将其清空只有很小的好处(实际上,如果不再使用它,优化编译器可能会跳过将其清空,即使您告诉它这样做,因为将不再访问的指针清空不会产生明显的变化)。

需要明确的是,为了响应您“想知道即使在程序结束后指针是否仍然会指向一个地址”,禁止通过内存映射文件或全局共享内存等内容进行显式持久化(这些都不适用于99% 的典型 C & C++ 代码),当程序实际退出时,所有程序内存都会被释放。当程序退出时,指针指向什么并不重要,因为指针本身在那时不再存在。

进一步说明:处理偶尔需要动态分配内存的正确方法通常是完全避免原始指针。从 C++14 开始,对于动态分配的情况,您的第一个示例简化为:

auto num = std::make_unique<int>(2);
Run Code Online (Sandbox Code Playgroud)

根本不需要delete或取消。原始指针仅用于非托管情况,例如堆栈情况,或者在函数调用期间“借出”智能指针中的原始指针(其中函数接受它不打算获取所有权的原始指针) ,这意味着您的程序通常可以避免使用newdelete根本,并且清空指针以避免双重delete或释放后使用问题不再有帮助(智能指针保持其有效,直到智能指针被破坏,此时它只被清理一次)。

  • @Ripi2 *“MS Windows 没有”* 嗯?需要引用。 (2认同)