考虑代码
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和所有权作为原子操作。
答案 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)
事实上,在此基础上,没有一个。