函数中定义的指针为空
Nulling pointers defined within function
在我继承的代码库中,我注意到前一个编码器会在函数关闭之前在函数内初始化空指针。
类似于:
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;
代码行告诉您指针没有拥有任何内存,而不是泄漏。(或者,有人意外删除了删除,这是不太可能的)
你可能会认为这是低效的;但是,如果编译器能够证明在您将指针设置为零的点之后没有人会读取指针,则编译器可以(根据假设规则)删除指针的无效。
因此,如果编译器能够计算出,成本为零。如果代码足够复杂,以至于编译器无法理解它,那么无论如何,冗余地将其清零可能是个好主意?
- 用户定义函数中的指针和输入
- 使用"Task"函数指针队列定义作业管理器
- 通过函数指针定义类范围之外的方法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 为什么不能将字符指针定义为数组?
- 块作用域中的函数指针定义
- 从较小类型的指针定义的范围构造向量
- 函数指针定义中是否允许使用参数名称
- 是对范围的指针定义明确的比较
- 无法将指针定义为用户定义的类,但我可以直接实例化
- C++ GoogleTest 使用夹具 - 无法访问函数指针定义
- 是指针定义行为映射中 nullptr 的默认值
- 是否应始终为具有原始指针成员的类中的深层复制指针定义复制构造函数
- 在类模板外部为指针定义函数
- 如何使用函数指针定义多集
- 使用结构作为指针定义变量
- 使用非常量指针定义对常量数据的指针的引用有什么问题?
- 是否有办法为类的指针定义括号操作符?
- 为智能指针定义类型是不好的做法吗?
- 为什么函数指针定义适用于任意数量的'&'号或星号"*"?