gpt4 book ai didi

c++ - 包装毛库的最佳实践内存管理

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:56 24 4
gpt4 key购买 nike

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 然后将原始内存暴露给这些函数.这有一个明显的缺点,即 shared_ptr 的使用将被违反,尤其是当内存被 ooqp 函数删除或编辑时。

除了非常小心地处理新建和删除之外,是否有更好的方法来处理这个问题?

最佳答案

哎呀!显而易见的答案是重构库以不要那样做。如果那不可能,您可以设计一个存储所有参数类型的类(希望有更具描述性的名称!)。

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.
}
};

几乎不言而喻,您应该为尽可能多的这些参数提供合理的默认值,以免给 future 的用户带来这种心痛。

关于c++ - 包装毛库的最佳实践内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25318610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com