使用智能指针管理函数内分配的内存

Using a smart pointer to manage memory allocated within function

本文关键字:分配 内存 函数 管理 智能 指针      更新时间:2023-10-16

背景

如果我有一个函数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值,所以我不能通过非常数引用传递它。

  1. 创建空的unique_ptr
  2. 创建指针
  3. 将指针传递给函数
  4. 将unique_ptr重置为该指针

比如:

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

简单的答案:你不能。但我相信有一种方法可以简化你的生活。由于你总是做同样的事情,你只需要编写一个函数来为你做这件事,并在需要时调用该函数。因为我想你想在释放之前使用写在内存中的返回值,所以我让我的函数返回它

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

这适合你吗?

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