unique_ptr旧函数的用法
unique_ptr usage for legacy functions
考虑代码
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());
}
坦率地说,我更喜欢您的逗号解决方案。当然,你仍然需要你健忘的异常快乐程序员记住使用它,所以它不能作为一个包罗万象的修复。
事实上,在这个基础上,没有一个。
相关文章:
- 构造函数的用法
- C++ 中函数中 Const 用法之间的差异
- 错误:使用复制和交换习惯用法的交换函数中"operator="的重载不明确
- 未命名的函数参数用法
- 使用指针复制构造函数用法
- CPP/C 中的常量用法和结构构造函数中的澄清
- 向下转换指向成员函数的指针.这是合法用法吗?
- 将 PIMPL 习惯用法与成员函数模板一起使用(无需预先了解所有可能的数据类型)
- 复制构造函数方法的用法
- C++向量用法错误:没有匹配的成员函数来调用"push_back"
- Constexpr静态成员函数用法
- 函数原型范围的有趣用法
- lambda 中的跨平台"auto"关键字用法:integral_constant作为函数参数
- 参数和成员变量在构造函数中的用法
- C 中的构造函数和破坏者的内联用法
- unique_ptr旧函数的用法
- 函数调用中“&”的用法,令人困惑
- 使用复制和交换习惯用法,复制对象的析构函数如何不解除分配指向内存
- 如何嵌入实时单元测试函数的主体作为 Doxygen 的示例用法
- C++析构函数删除包含动态数组作为数据成员的对象时的用法