如何判断函数参数是否可以安全删除

How to tell if a function parameter can be safely deleted

我想知道是否有任何方法可以判断函数是否可以安全地删除作为参数传递的对象。

代码:

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() 中使用它?

如果你可以迁移到 C++11,你应该使用 std::shared_ptr,你的问题就解决了。 shared_ptr 将关注指针的用户数量,并在最后一个用户处理时自动清理它。而且我强烈建议转移到现代 C++,它解决了很多问题。

您也可以看看 Boost SmartPtr - 它本质上是一样的,可以在 C++11 之前使用。

您也可以尝试自己实现这样的实用程序,但您必须确保正确实现它 - 参考计数器本着 Rule of Three

的精神正确递增和递减

如果您必须使用原始指针,那么在标准 C++ 中就没有办法保证指针会(或不会)被函数释放。
通知其他程序员您的函数想要获得指针的所有权(并将删除它)的唯一方法是通过 documentation,或者在代码中(带注释),或者使用单独的文档(例如,如果您创建 API)。

但是,您应该认真考虑函数 是否应该 获得指针的所有权。函数拥有它是否合理?如果没有,就离开它,让分配函数负责释放。

实际上您可以在 C++ 98 中执行此操作。不需要新标准。 不要将 delete 放在 f 内。相反,只需使用 auto_ptr guard:

创建传递给 f 的对象
Test *obj = new Test();

f(auto_ptr<Test>(new Test()).get());
f(obj);

自动指针将确保对象在函数执行结束后被释放。

嗯,老实说*几乎一样。如果您明确需要删除 f 内的指针而不仅仅是保护它以确保它被释放,那么您确实需要智能指针而不仅仅是 auto_ptr,为此您必须使用 boost 或 c++11还是自己写吧,实现起来真的不复杂

另请注意 auto_ptr 在新标准中已弃用,因此此代码不向前兼容。