背景
如果我有一个函数foo
如下
void foo(std::vector<int>& values)
{
values = std::vector<int>(10, 1);
}
然后我可以将其称为
std::vector<int> values;
foo(values);
请注意,初始vector
为空,然后填充在函数foo
中。
我经常遇到无法改变的界面(即第三方),其意图与上述相同,但使用原始数组,例如
void foo(int*& values)
{
values = new int[10];
std::fill_n(values, 10, 1);
}
我的问题是现在我负责管理那个记忆,例如
int* values;
foo(values);
delete[] values;
问题
有什么方法可以使用智能指针为我管理这个内存吗?我想做点什么
std::unique_ptr<int[]> values;
foo(values.get());
但是get
返回一个r值的指针,所以我不能通过非const引用传递它。
答案 0 :(得分:2)
就像那样:
std::unique_ptr<int[]> values;
int* values_ptr;
foo(values_ptr);
values.reset(values_ptr);
或者:
int* values_ptr;
foo(values_ptr);
std::unique_ptr<int[]> values(values_ptr);
答案 1 :(得分:1)
简单回答:你做不到。 但我相信有一种方法可以简化你的生活。因为你总是做同样的事情,你只需编写一个为你做的功能,并在你需要时调用该功能。因为我想你想在释放它之前使用在内存中写入的返回值,我让我的函数返回它。
template <typename T, typename Function>
std::unique_ptr<T[]> call(Function f) {
T * value;
f(value);
return { value };
}
// then to use it
auto value = call<int>(foo);
这适合你吗?
如果需要,可以改进函数来检测指向一个对象或数组的指针的差异,并且可能还可以改进它以自动检测所需的参数类型,这样就不必键入它。