Closed F1F88 closed 1 week ago
未采用的方案
使用 spdlog v2.x。 但 v2.x 的近期活跃度偏低,且实际上升级到 v2.x 也不能解决此问题
实际采用的方案
使用 log4sp::ReplacePathSep 将传入的路径分隔符替换为 log4sp 编译时所在的操作系统的分隔符,其中替换后的字符串是 new 出来的,但并没有在合适的时候回收,所以存在内存泄漏
可以不修改源码,修复此方案的内存泄漏继续解决这个问题 但略麻烦,所以此补丁选择了更改 spdlog 的 short_filename_formatter::basename 源码
编译时不再按编译时所运行的操作系统直接写死分隔符, 而是每次都先查找 '/' 分隔符,如果没找到;再查找 '\' 分隔符,从而得到路径末尾的文件名
其中查找顺序很重要
'/' 是 Windows 的特殊字符 '\' 不是 Linux 的特殊字符
此方案已知的唯一缺点是
在最不理想的情况下,需要遍历两次路径字符串 (路径最大长度 260) 且很多 plugins 都是在 win 中编译的,这些 plugin 都需要遍历两次
问题起源
早期解决方案
未采用的方案
使用 spdlog v2.x。 但 v2.x 的近期活跃度偏低,且实际上升级到 v2.x 也不能解决此问题
实际采用的方案
使用 log4sp::ReplacePathSep 将传入的路径分隔符替换为 log4sp 编译时所在的操作系统的分隔符,其中替换后的字符串是 new 出来的,但并没有在合适的时候回收,所以存在内存泄漏
可以不修改源码,修复此方案的内存泄漏继续解决这个问题 但略麻烦,所以此补丁选择了更改 spdlog 的 short_filename_formatter::basename 源码
新的解决方案
编译时不再按编译时所运行的操作系统直接写死分隔符, 而是每次都先查找 '/' 分隔符,如果没找到;再查找 '\' 分隔符,从而得到路径末尾的文件名
其中查找顺序很重要
'/' 是 Windows 的特殊字符 '\' 不是 Linux 的特殊字符
此方案已知的唯一缺点是
在最不理想的情况下,需要遍历两次路径字符串 (路径最大长度 260) 且很多 plugins 都是在 win 中编译的,这些 plugin 都需要遍历两次