1

我正在尝试通过静态库将 Stockfish 实施到我自己的项目中。但是我遇到了一个问题。Stockfish 在“Stockfish”的命名空间中使用了一些全局变量,并且在我的项目中的某个时刻,我想销毁我从 Stockfish 使用的所有内容并稍后重新初始化。

例如,Stockfish 将选项存储在 Stockfish::Options 的全局对象中。当我第一次初始化 Stockfish 时,一切都很好。但是我想要实现它结束 Stockfish 并从变量中删除它的所有成员而不关闭我的项目并在我想要的时候重新初始化它。

据我了解,Stockfish 不是为此而设计的。设计为“启动引擎,关闭主程序时结束引擎。”。

所以,我相信我必须经历每一次初始化并找到结束它们的正确方法。在此之前,我想问三个问题:

  • 我可以告诉我的程序清理“这个特殊的.lib”使用的内存吗?
  • 我可以编写一个代码来删除由命名空间初始化的整个内存吗?例如,由于 Stockfish 是整个代码的命名空间,我可以执行“删除 Stockfish”之类的操作吗??
  • 有没有其他我想不出的方法来实现我想做的事情?
4

1 回答 1

2

该工具无法轻松释放特定库使用的内存。

  • 不记录静态库边界,并且在运行时不存在(调试符号中可能除外)。

  • 分配器通常不记录分配的位置

  • 命名空间也是如此。命名空间在运行时不存在,调试符号除外。您不能引用命名空间。

有两种直接的解决方案:

  1. 在单独的进程中运行 Stockfish。当进程退出时,所有内存都被释放。这是简单的方法。

  2. 修改 Stockfish 以便您可以释放内存。查找所有全局状态和所有分配,并确保您可以释放这些分配并将全局状态重置为初始值。这是艰难的道路。

于 2021-07-31T23:50:13.143 回答