首页 > 解决方案 > gsl_vector 如何拥有 gsl_block?

问题描述

在 GSL 的参考手册中写道

指针块存储向量元素所在的内存块的位置(如果有的话)。如果向量拥有该块,则所有者字段设置为 1,并且当向量被释放时,该块将被释放。

但是“如果向量拥有块”是什么意思?

以下是gsl_vector的结构

typedef struct
{
  size_t size;
  size_t stride;
  double * data;
  gsl_block * block;
  int owner;
} gsl_vector;

标签: gsl

解决方案


根据文档:

为了一致性,所有内存都是通过 gsl_block 结构分配的。

下一个:

向量和矩阵是通过对底层块进行切片来制作的。

基本上,您可以使用现有的内存块来获取新的向量,例如,(由于某种原因未记录)函数alloc_from_blockalloc_from_vector. 在这种情况下owner设置为 0 并且当您释放初始块保持分配的向量时:

void
FUNCTION (gsl_vector, free) (TYPE (gsl_vector) * v)
{
  RETURN_IF_NULL (v);

  if (v->owner)
    {
      FUNCTION(gsl_block, free) (v->block) ;
    }
  free (v);
}

推荐阅读