protocol buffer库模板函数导致的内存错误问题

最近调查一个protocol buffer库的问题:应用程序使用了libprotobuf-lite库,在调试Debug版本时如果链接了Release版本的libprotobuf-lite库,会在调用RepeatedPtrFieldBase::Destroy()时报告堆出错;但是如果链接的是Debug版本的libprotobuf-lite库就能正常运行。
调查了很长时间,原因可能是这样的:
1. 在编译Release版本的libprotobuf-lite库时,链接的是Release版本的VC库:
void RepeatedPtrFieldBase::Reserve(int new_size) { 调用
void** RepeatedPtrFieldBase::InternalExtend(int extend_amount) {
...
    rep_ = reinterpret_cast<Rep*>(
        new char[kRepHeaderSize + sizeof(old_rep->elements[0]) * new_size]);
是在protobuf库文件repeated_field.cc中定义的普通类成员函数,new引用的(malloc)是Release版本的VC库;
2. 在编译Debug版本的应用程序时用到了protobuf库的模板函数:
template <typename TypeHandler>
void RepeatedPtrFieldBase::Destroy() {
...
      delete [] reinterpret_cast<char*>(rep_);
模板函数要有具体的模板参数才能生成代码,因此会延迟到编译应用程序时才生成具体代码,delete引用的(free)是Debug版本的VC库。

于是内存分配和释放采用了不同的库,导致了前面描述的问题。
总结:一般第三方程序库在链接前就完成了所有目标文件(.obj)的生成,链接生成库时内存分配和释放代码会引用相同版本的VC库,因此不管应用程序是Debug版本还是Release版本使用都没有问题。而象protobuf这样带有模板函数的程序库,相关的二进制代码在链接库时没有全部生成,部分延期到了编译应用程序代码时,因此无法保证库导出函数和模板函数会引用相同版本的VC库,一旦这两处出现内存分配和释放的处理交叉就会导致潜在的内存错误。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值