Sha*_*nOH 4 c++ design-patterns memory-management unique-ptr
我正在重构一些旧代码.有一个C风格的功能是这样的:(显然我在这里简化了它)
int LoadData(char** buf1, int* buf1Len, char** buf2, int* buf2Len) {
*buf1Len = DetermineLength1();
*buf1 = (char*)malloc(*buf1Len);
// Fill buf1
*buf2Len = DetermineLength2();
*buf2 = (char*)malloc(*buf2Len);
// Fill buf2
int result = 0; // Or some other INT depending of result
return result;
}
Run Code Online (Sandbox Code Playgroud)
现在,我想更新此代码以某种方式返回unique_ptr或等效,因此指针将由调用者自动管理,并且调用者将永远不会忘记释放内存.
我找不到一个好的解决方案,所以目前我已将代码更改为以下内容:
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;
}
Run Code Online (Sandbox Code Playgroud)
这看起来不太好,所以我想看看是否有更好的解决方案.因为我正在返回两个缓冲区,所以使用unique_ptr
as作为返回值不是一个选项.
有没有更好的方法呢?
Ben*_*ley 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) };
}
Run Code Online (Sandbox Code Playgroud)
如果仍需要int
返回结果,则可以更改要返回的功能std::tuple<int, std::vector<char>, std::vector<char>>
.或者更好的是,为成员创建一个具有有意义名称的结构.
归档时间: |
|
查看次数: |
165 次 |
最近记录: |