我正在重构一些旧代码。这样的C风格功能就像这样:(显然我已经在这里简化了它)
int LoadData(std::unique_ptr<char[]>* ubuf1, int* buf1Len, std::unique_ptr<char[]>* ubuf2, int* buf2Len) {
// same code as above, and finally:
ubuf1->reset(buf1);
ubuf2->reset(buf2);
return result;
}
现在,我想更新此代码以某种方式返回unique_ptr或等效代码,因此指针将由调用者自动管理,并且调用者不会忘记释放内存。 / p>
我无法找到一个好的解决方案,所以目前我已将代码更改为以下内容:
unique_ptr
这看起来并不好,所以我想看看是否有更好的解决方案。由于我正在返回两个缓冲区,因此使用{{1}}作为返回值不是一个选项。
有没有更好的方法呢?
答案 0 :(得分:10)
如果不需要,请不要将std::unique_ptr
用于数组。存储动态数组的正确工具通常是std::vector
。它将大小信息与其所属的对象一起打包。如果您的char*
被用作字符串,那么您可能希望改为使用std::string
。
std::pair<std::vector<char>, std::vector<char>>
LoadData()
{
std::vector<char> buf1(DetermineLength1());
// Fill buf1
std::vector<char> buf2(DetermineLength2());
// Fill buf2
return { std::move(buf1), std::move(buf2) };
}
如果您仍需要int
返回结果,则可以更改该函数以返回std::tuple<int, std::vector<char>, std::vector<char>>
。或者更好的是,为成员创建一个具有有意义名称的结构。