unique_ptr旧函数的用法

unique_ptr usage for legacy functions

本文关键字:用法 函数 ptr unique      更新时间:2023-10-16

考虑代码

struct Resource
{
    Resource()
    {
        std::cout << "C";
    }
    ~Resource()
    {
        std::cout << "D";
    }
};
void allocate(Resource **p)
{
    *p = new Resource();
}
int main()
{
    Resource *p = nullptr;
    allocate(&p);
    std::unique_ptr<Resource> uptr(p);
    //stuff
}

假设"分配"函数在多个调用站点的遗留代码中大量使用,main 函数显示尝试使用 unique_ptr 来管理分配的资源。当团队中的另一个程序员在"分配"之后和"unique_ptr"拥有它之前编写容易出现异常的代码时,就会出现问题。

因此,我想到的一种解决方案是编写利用逗号运算符的代码,如下所示

std::unique_ptr<Resource> up((allocate(&p), p));

有没有其他合理的方法来处理这种情况?基本问题是将所有位置和所有权作为原子操作。

为了最平滑的过渡,请创建 allocate 的重载:

template <typename T>
void allocate(std::unique_ptr<T>* p) {
  T* raw;
  allocate(&raw)
  p->reset(raw);
}

现有呼叫站点将继续工作不变。更新调用站点时,将原始指针替换为 unique_ptr ,并删除释放资源的任何行,但保持代码不变。(将传递原始指针的位置替换为 .get()

执行此操作的典型方法是从重载函数返回unique_ptr

std::unique_ptr<Resource> allocate()
{
    return std::unique_ptr<Resource>(new Resource());
}

坦率地说,我更喜欢您的逗号解决方案。当然,你仍然需要你健忘的异常快乐程序员记住使用它,所以它不能作为一个包罗万象的修复。

事实上,在这个基础上,没有一个。