遗留函数的unique_ptr用法

时间:2014-01-15 15:53:11

标签: c++ c++11

考虑代码

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
}

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

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

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

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

3 个答案:

答案 0 :(得分:2)

为了实现最顺畅的过渡,请创建allocate的重载:

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

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

答案 1 :(得分:1)

这样做的典型方法是从重载函数返回unique_ptr

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

答案 2 :(得分:0)

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

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