我想知道是否有任何方法可以判断函数是否可以安全地删除作为参数传递的对象。
代码:
struct Test {
};
void f(Test *ptr) {
delete ptr; //if i delete the pointer here,
//i cannot use obj in main
}
int main() {
Test *obj = new Test;
f(new Test);
f(obj);
//delete obj; //obj has already been deleted in f()
}
是否有任何方法可以释放由f(new Test)分配的内存,但是保留obj并仍在main()中使用它?
答案 0 :(得分:1)
如果可以使用C ++ 11,则应使用std::shared_ptr
,这样就可以解决问题。 shared_ptr
会注意指针的用户数量,并在最后一个用户处理它时自动清除它。而且我强烈建议转移到现代C ++中,它可以解决很多问题。
您也可以看看Boost SmartPtr-它与essentailly一样,可以在C ++ 11之前使用。
您也可以尝试自己实现该实用程序,但是您必须确保正确实现它-按照Rule of Three的精神正确地增加和减少参考计数器
如果必须使用原始指针,那么标准C ++中就无法保证函数会(或不会)释放指针。
通知其他程序员您的函数要获取指针所有权(并将删除指针)的唯一方法是通过 documentation 或代码中(带有注释)或单独的文档(如果例如,您创建一个API)。
但是,您应该强烈考虑函数应该是否拥有指针的所有权。拥有功能是否合理?如果没有,则保留它,让分配函数负责释放。
答案 1 :(得分:0)
实际上,您可以在C ++ 98中执行此操作。不需要新标准。 您没有在f内放置删除。相反,只需使用auto_ptr保护器创建传递给f的对象即可:
Test *obj = new Test();
f(auto_ptr<Test>(new Test()).get());
f(obj);
自动指针将确保函数执行结束后释放对象。
嗯,说实话,它几乎是一样的。如果您明确需要删除f内的指针,而不仅仅是保护它以确保释放它,那么您真的需要智能指针,而不仅仅是auto_ptr,为此,您必须使用boost或c ++ 11或只编写它您自己,实施起来确实并不复杂。
还请注意,新标准中已弃用了auto_ptr,因此该代码不向前兼容。