[英]Protobuf with C++ plugins
我们正在从事一个相对大型的C ++项目,我们从一开始就选择使用protobuf作为存储和传输数据的Lingua Franca 。
我们遇到了第一个问题,因为由于protobuf生成的类元数据存储在静态指针中,在第一次调用构造函数时分配并且从未释放过,所以导致程序结束时内存泄漏。 我们发现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()
,其自身尝试破坏已卸载类型的元数据... CRASH。
长话短说:我们是否应谴责在关闭工具时发生大量“正常”内存泄漏或崩溃。 是否有人遇到过同样的问题并找到了更好的解决方案? 我的诊断不好吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.