【问题标题】:Cleaning the memory that Stockfish uses without closing the main program在不关闭主程序的情况下清理 Stockfish 使用的内存
【发布时间】:2021-07-31 23:40:19
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c++ memory-management stockfish


    【解决方案1】:

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

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

    • 分配器通常不会记录在哪里进行了分配。

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

    有两种直接的解决方案:

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

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

    【讨论】:

    • 哦,我明白了...只是问,使用 dll 代替 lib 工作吗?我可以随时加载 dll 并关闭它吗?这也会清理内存吗?
    • 您可以卸载 DLL,但不会卸载 DLL 分配的内存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2015-12-02
    • 1970-01-01
    • 2017-04-28
    相关资源
    最近更新 更多