使用智能指针管理在函数

时间:2015-11-13 12:51:45

标签: c++ arrays smart-pointers

背景

如果我有一个函数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引用传递它。

2 个答案:

答案 0 :(得分:2)

  1. 创建空unique_ptr。
  2. 创建指针。
  3. 将指针传递给函数。
  4. 将unique_ptr重置为该指针。
  5. 就像那样:

    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);

这适合你吗?

如果需要,可以改进函数来检测指向一个对象或数组的指针的差异,并且可能还可以改进它以自动检测所需的参数类型,这样就不必键入它。