在 SCIP 优化软件中释放 SCIP_SOL* 和 SCIP*

Freeing SCIP_SOL* and SCIP* in SCIP optimization software

我初始化scip环境如下:

SCIP* scip = nullptr;
SCIP_CALL( SCIPcreate(&scip) );

我创建了一个学习 SCIP 的小问题,我将解决方案存储在

SCIP_SOL* sol = nullptr;
sol = SCIPgetBestSol(scip);

我正在尝试通过 solscip 释放内存,但我 运行 陷入了分段错误。

这会导致段错误:

SCIP_RETCODE retcode =  SCIPfreeSol(scip,&sol);
assert(retcode == SCIP_OKAY);


retcode = SCIPfree(&scip);
assert(retcode == SCIP_OKAY);

如果我在释放 scip 之前没有释放 sol,它工作正常并且没有发生段错误,但我确信它是不正确的。我已经检查了 SCIP Optimization Suite 附带的一些其他代码,一些代码示例使用 SCIPfreeSol 而有些则没有,即使它们都使用 SCIP_SOL *sol 来定义 sol 变量。

编辑:这个问题确实有效。我没有包含实际的模型代码。

如果您通过 SCIPcreateSol 或类似方式创建解决方案,则只需释放该解决方案。当您通过 SCIPgetBestSol(scip) 寻求最佳解决方案时,这只是 returns 您指向 SCIP 内部创建的解决方案的指针。 SCIP 也会释放它,因此您不必自己执行此操作。同时,由于它不是您的 "own" 解决方案,因此您不应修改此解决方案。如果你想这样做,你应该创建自己的一个或通过 SCIPcreateSolCopy.

复制最好的一个

因此,在您的示例中仅释放 scip 是正确的。