c++ - 将 unique_ptr 与 gsl_vector 一起使用

标签 c++ unique-ptr gsl

我最喜欢的方面之一 unique_ptr是它提供的自动内存管理。我想使用 unique_ptr用类似 GSL vector 的东西。

然而,gsl_vector有自己的内存释放机制(gsl_vector_free)。有没有办法强制唯一指针使用 GSL 的 vector 释放方法? Valgrind(正确)在创建 unique_ptr<gsl_vector> 时报告 malloc/delete 的不匹配使用下面:

#include <memory>
#include <gsl/gsl_vector.h>

void mem_gsl() {
  gsl_vector *vec;
  vec = gsl_vector_calloc(2);
  gsl_vector_set(vec, 0, 2.0);
  printf("%f\n", gsl_vector_get(vec, 0));
  gsl_vector_free(vec);  // Without this, there is a memory leak.
}

void mem_unique_ptr() {
  std::unique_ptr<gsl_vector> vec;
  vec.reset(gsl_vector_calloc(2));
  // Using .get() each time I want to use the gsl_vector seems like overhead.
  gsl_vector_set(vec.get(), 0, 2.0);
  printf("%f\n", gsl_vector_get(vec.get(), 0));
  // Valgrind correctly reports a mismatched use of delete and free.
}

int main(int argc, char *argv[]) {
  mem_gsl();
  mem_unique_ptr();
  return 0;
}

此外,必须调用 get()每次我想访问一个 vector 元素时都显得相当乏味。有解决办法吗?

最佳答案

您可以通过为 std::unique_ptr 提供自定义删除器来实现。像这样的事情可能会做:

auto del = [](gsl_vector* p) { gsl_vector_free(p); };
std::unique_ptr<gsl_vector, decltype(del)> vec(gsl_vector_calloc(2), del);

关于c++ - 将 unique_ptr 与 gsl_vector 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20889117/

相关文章:

c++ - 超过 32705 个线程时 boost::thread_resource_error

C++ 游戏状态系统

c++ - 我们如何从成员函数返回一个 unique_pointer 成员?

前向声明类的 unique_ptr 的 C++11 容器

c++ - vector vs unique_ptr 到 c 风格的函数

在 Windows 上使用 GSL 运行 C 代码的编译错误通过 R 调用

C++ 函数按值调用的奇怪行为

c++ - 错误 : invalid conversion from char to const char*

c++ - 在 C++ 中编写一堆类似的 if 语句的好方法?

使用 gsl multimin 在同一范围内计算 f 和 df/dx