ooqp库已在我的工作场所投入使用.目前有一名学生将其包裹起来,我想知道解决这个问题的最佳方法.以下是该程序使用的函数示例:
newQpGenSparse( double ** c, int nx,
int ** irowQ, int nnzQ, int ** jcolQ, double ** dQ,
double ** xlow, char ** ixlow,
double ** xupp, char ** ixupp,
int ** irowA, int nnzA, int ** jcolA, double ** dA,
double ** b, int my,
int ** irowC, int nnzC, int ** jcolC, double ** dC,
double ** clow, int mz, char ** iclow,
double ** cupp, char ** icupp,
int * ierr );
http://pages.cs.wisc.edu/~swright/ooqp/ooqp-userguide.pdf
总权利?该库是用c编写的,所以我正在寻找一种巧妙管理内存的方法.
在与这些函数接口时使用原始指针是必要的,但我希望可能更好的方法是使用std :: shared_ptr然后将原始内存暴露给这些函数.这有一个明显的缺点,即如果ooqp函数删除或编辑了内存,则会违反shared_ptr的使用.
有没有更好的方法来处理这个,然后只是非常小心新的和删除?
最佳答案 哎呀!显而易见的答案是重构库而不是那样做.如果这是不可能的,你可以设计一个存储所有参数类型的类(希望有更多的描述性名称!).
class QPGenSparseWrapper
{
// Only store params if you want to manage their memory.
double* Param1;
public:
QPGenSparseWrapper(const double* param1, const int param2 /* , ... */, param16 = 22) :
Param1(param1),
{
newQpGenSparse(&Param1, param2 /* , ... */, param16);
}
virtual ~QPGenSparseWrapper()
{
freeQpGenSparse(/* params */);
// If no corresponding free, use smart pointers or manual delete.
}
void Run(/* more params?!? */)
{
// I hope you know what goes here.
}
};
毫无疑问,您应该为尽可能多的这些参数提供合理的默认设置,以便为将来的用户带来这样的心痛.