函数中定义的指针为空

Nulling pointers defined within function

本文关键字:指针 定义 函数      更新时间:2023-10-16

在我继承的代码库中,我注意到前一个编码器会在函数关闭之前在函数内初始化空指针。

类似于:

void MainClass::run() {
MyClass* _classPtr = GetClassPtr(); // Assume no problems here.
// do stuff to _classPtr
_classPtr = nullptr; // Is this even necessary?
return;
}

我发现这是不必要的,因为指针的内存(不是对象本身,只是指针)应该在函数关闭时释放。这是真的吗?

没有必要这样做。当函数超出范围时,指针使用的内存将被释放,无论它被设置为什么。然而,指向的对象将不会被释放。

这可能只是以前的开发人员采用的一种编码标准。

当变量_classPtr超出作用域时,它将消失,这在函数返回时发生,因此不需要将其重新分配为空指针。

谈到返回,一旦函数到达其末尾,它将自动返回,不需要在没有返回值的函数末尾显式返回。

你是对的,这只是一种个人编程实践,没有任何效果。编译器可能会对整个过程进行优化,因此在运行时不会产生任何实际的代码。

它也可能是该函数以前版本的残余,可能有更多的代码,但它被删除了,只是重新初始化部分被遗忘了。

只有堆中分配的内存,即使用new运算符初始化的内存,在关闭函数时不会释放。

函数内部定义的局部变量或自动变量将自动释放。

可以使用的一种有用模式是,每个指针在其所拥有的资源被回收后立即为null。

如果指针资源不需要回收,并且将不再使用,则在不进行回收的情况下为null。

然后,在调试或推理函数的任何时候,唯一的非零指针是那些具有"活动"(有效)内存或正在清理的指针。

如果你知道给定的指针总是包含一个资源,你可以"盲目地"执行"If(ptr)delete ptr;ptr=0;",而不用担心有人已经清理了它。

另一方面,旁边没有删除的ptr=0;代码行告诉您指针没有拥有任何内存,而不是泄漏。(或者,有人意外删除了删除,这是不太可能的)

你可能会认为这是低效的;但是,如果编译器能够证明在您将指针设置为零的点之后没有人会读取指针,则编译器可以(根据假设规则)删除指针的无效

因此,如果编译器能够计算出,成本为零。如果代码足够复杂,以至于编译器无法理解它,那么无论如何,冗余地将其清零可能是个好主意?