将unique_ptr与gsl_vector一起使用
Using unique_ptr with gsl_vector
我最喜欢的unique_ptr
的一个方面是它提供的自动内存管理。我想将unique_ptr
与GSL向量之类的东西一起使用。
但是,gsl_vector
有自己的释放内存的机制(gsl_vector_free
)。有没有办法强制唯一指针使用 GSL 的矢量释放方法?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("%fn", 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("%fn", 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()
似乎相当乏味。有没有办法解决这个问题?
您可以通过
为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);
拥有make_unique_gsl_vector和自定义删除器:
#include <memory>
// Fake gsl
typedef int gsl_vector;
gsl_vector* gsl_vector_calloc(std::size_t) { return 0; }
void gsl_vector_free(gsl_vector*) {}
// Deleter
struct gsl_vector_deleter {
void operator () (gsl_vector* p) {
gsl_vector_free(p);
}
};
// Unique Pointer
typedef std::unique_ptr<gsl_vector, gsl_vector_deleter> unique_gsl_vector;
unique_gsl_vector make_unique_gsl_vector() {
return unique_gsl_vector(gsl_vector_calloc(2));
}
int main() {
make_unique_gsl_vector();
return 0;
}
为了避免.get()
调用和其他与将gsl_vector
包装在unique_ptr
中相关的样板,您可以创建一个小型 RAII 包装器。
namespace gsl {
class vector
{
std::unique_ptr<gsl_vector, decltype(&gsl_vector_free)> v_;
public:
explicit vector(std::size_t num)
: v_(gsl_vector_calloc(num), gsl_vector_free)
{}
double operator[](std::size_t idx) const
{
return gsl_vector_get(v_.get(), idx);
}
void set(std::size_t idx, double value)
{
gsl_vector_set(v_.get(), idx, value);
}
};
}
这不仅避免了样板,而且还允许您轻松扩展功能,例如,添加一个采用std::initializer_list<double>
的构造函数,以便您可以在单个表达式中构造和初始化向量。
现场示例
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 如何将AERT_Allocate与 std:vector 一起使用
- 将用户定义的类型与 std::vector 和 std::sort 一起使用
- 我不能将 'fill' std::vector 构造函数与 unique_ptrs 一起使用
- 为什么 std::foreach 不能与 std::vector 一起使用<bool>?
- 使用 std::vector<Particle> 粒子;函数 .at() 不能与迭代器一起使用,它作为 for 循环中的参数
- 将 std::vector emplace_back() 与 std::p air 一起使用,并带有构造函数初始值设定项
- 是否可以重载模板函数以与 std::vector 的元素一起使用
- <vector> 与 cin 和 for() 循环C++一起使用
- 将make_move_iterator与vector::insert一起应用有意义吗?(C++)
- 如何将 std::vector::emplace_back 与 vector<int><vector> 一起使用?
- 将 std::vector 与类元素一起使用时出现内存泄漏
- 将 std::vector 与结构一起使用时出现不完整的类型错误
- 将std::vector与std::thread一起使用
- 将Vector与类一起使用时没有运算符错误
- 如何将 Vector<T>::reverse_iterator 与一个元素一起使用
- 将自定义类与向量一起使用:'std::vector'默认构造函数错误
- 如何在 C++11 中将 vector 与引用类型实例对象一起使用
- 如何访问 std::vector 的内部连续缓冲区,是否可以将其与 memcpy 等一起使用
- 将strcpy与std::vector一起使用