gpt4 book ai didi

c++ - 带有 C++ 插件的 Protobuf

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:31:14 25 4
gpt4 key购买 nike

我们正在开展一个规模相对较大的 C++ 项目,我们在一开始就选择使用 protobuf 作为我们的通用语言来存储和传输数据。

我们遇到了第一个问题,因为程序结束内存泄漏是由于 protobuf 生成的类元数据存储为静态指针,在第一次调用构造函数期间分配并且从未释放。我们发现了 Mr. Google 提供的一个很好的函数来做这个清理:

google::protobuf::ShutdownProtobufLibrary();

除了没有对称调用外工作正常,所以一旦完成你就不能再使用任何东西了。您必须在可执行文件中恰好执行一次。我们做了任何懒惰的开发人员都会做的事情:

struct LIBPROTOBUF_EXPORT Resource
{
~Resource()
{
google::protobuf::ShutdownProtobufLibrary();
}
};

bool registerShutdownAtExit()
{
static Resource cleaner;
return true;
}

并且我们在 cc 文件的 protobuf 生成中添加了一个:

static bool protobufResource = mlv::protobuf::registerShutdownAtExit();

它运行了好几个月。

然后我们在我们的工具中添加了对动态可加载插件 (dll) 的支持。其中一些使用 protobuf。插件的卸载工作正常,但是当其中不止一个使用 protobuf 时,我们在卸载最后一个时遇到了一个小崩溃。原因:最后卸载会破坏 cleaner 实例,它本身试图 google::protobuf::ShutdownProtobufLibrary(),它本身试图破坏卸载类型的元数据。 .崩溃。

长话短说:我们是否注定要在关闭我们的工具时出现大量“正常”内存泄漏或崩溃。有没有人遇到过同样的问题并找到了更好的解决方案?我的诊断不好吗?

最佳答案

就像 johnathon 在他的评论中建议的那样,使用引用计数方案,或使用 atexit 注册您的销毁例程。这样的例程是独立的,但对于您的情况来说可能效果很好。

相关文档:

编辑:你是对的,基本上是一样的。没想到这一点。

另一个建议:对所有使用 protobuf 的插件使用全局资源单例。这个有一个全局析构函数,只有在插件第一次使用 protobuf 库时才会注册。或者只要在使用时设置一个标志,然后仅在设置标志时调用 ShutdownProtobufLibrary。

关于c++ - 带有 C++ 插件的 Protobuf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11672917/

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