从广义上讲,我正在寻找处理在使用智能包装器替换T *时内部调用的遗留函数f(T*)
的最佳方法。在我的情况下,T
为gsl_vector
,我正在创建一个存储Vector
的类gsl_vector*
。该类既作为包装器,实现重载的数字运算符,又作为智能指针,处理gsl_vector*
指针的资源分配和释放。但是,当使用gsl的数字根查找工具时,我遇到了一个小问题。这个过程要求我创建一个对象gsl_multiroot_function_fdf
,它是一个包含函数指针的结构,如
int (* fdf) (const gsl_vector * x, void * params, gsl_vector * f, gsl_matrix * J)
此函数指针在GSL的内部算法中调用,因此我无法控制传入的gsl_vector*
和gsl_matrix*
,特别是我不拥有它们。我确实可以完全控制这些函数指针引用的函数,我想利用我的Vector
(和Matrix
)包装器,因为我有很多计算来做包装器简化。最简单的方法是创建新的Vector
和Matrix
对象并将其数据复制到f
和J
,但所有这些复制都是不必要且缓慢的。最好是包装f
和J
并直接修改它们。通过我现在拥有的包装器的简单实现,如果在这些指针中创建一个包装器,但是当包装器超出范围时,它们的内存将被释放。
在这种情况下,是否有可接受的最佳做法,我希望我可以完全强制执行所有gsl_vector*
和gsl_matrix*
数据的RAII封装,但由于遗留代码而无法实现?我现在的解决方案是在我的softwrap
和Vector
类中使用典型的假布尔Matrix
,并使用命名构造函数
static Vector SoftWrap(gsl_vector* v);
使用Vector
创建softwrap=true
。当此布尔值为true时,不会在析构函数中释放内存。这种方法似乎有效,但也许它在某种程度上是愚蠢的,我没有预料到。
一个单独但可能相关的问题是如何处理const gsl_vector*
个对象。已经存在单独的stackoverflow问题(建议:ConstVector
类,模板等)。