在我继承的代码库中,我注意到在函数关闭之前,前一个编码器会在函数内初始化指针。
类似的东西:
void MainClass::run() {
MyClass* _classPtr = GetClassPtr(); // Assume no problems here.
// do stuff to _classPtr
_classPtr = nullptr; // Is this even necessary?
return;
}
我发现它是不必要的,因为指针的内存(不是对象本身,只是指针)应该在函数关闭时释放。这是真的吗?
答案 0 :(得分:4)
变量_classPtr
在超出范围时将消失,这在函数返回时发生,因此不需要将其重新分配为空指针。
谈到返回,一旦函数到达终点,它将自动返回,不需要在没有返回值的函数末尾显式返回。
答案 1 :(得分:4)
没有必要这样做。当函数超出范围时,指针使用的内存将被释放,无论它设置为什么。但是,指向的对象不会被释放。
这可能只是前一位开发人员采用的编码标准。
答案 2 :(得分:2)
你是对的,这只是一个个人编程实践,并没有完成任何事情。编译器可能会优化整个过程,因此实际上最终不会在运行时生成任何实际代码。
它也可能是此函数的先前版本的残余,可能有更多的代码,但它被删除,除了重新初始化部分被遗忘。
答案 3 :(得分:0)
只有在堆中分配的内存,即使用OPENROWSET
运算符初始化的内存在关闭函数时才会被释放。
将自动释放函数内定义的局部变量或自动变量。
答案 4 :(得分:0)
可以使用的一个有用模式是每个指针在它所持有的资源被回收后立即被清空。
如果指针资源不需要回收,并且不再使用,那么它就会被废弃而没有回收利用。
然后,在调试或推理它时,在函数的任何一点,唯一的非零指针是那些具有“实时”(有效)内存,或者正在被清理的那些。
如果你知道一个给定的指针总是拥有一个资源,你可以“盲目地”做一个“if(ptr)delete ptr; ptr = 0;`而不用担心有人已经把它清理干净了。”
另一方面,一行代码ptr=0;
旁边没有删除,告诉你指针不是拥有任何内存,而不是泄漏。 (或者,有人意外删除了删除,这种可能性较小)
你可能认为这是低效的;但是如果编译器可以证明没有人会在你将其设置为零的点之后读取指针,则编译器可以(在as-if规则下)删除指针的归零。
因此,如果编译器能够解决问题,那么成本为零。如果代码足够复杂,以至于编译器无法弄清楚它,那么无论如何都可能将它冗余地归零会是一个好主意吗?