繁体   English   中英

带C ++插件的Protobuf

[英]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。

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

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

相关文件:

编辑:您是对的,基本上是同一回事。 没想到。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM