boost 怎么对基本类型的指针进行boost 序列化 vector

二次元同好交流新大陆
扫码下载App
汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
&& & & Boost Serialization中的类继承关系比较清晰,不过接口让我感觉有点晕。basic_iarchive_impl是一个很重要的类,它是一个比较底层的基类,text_iarchive和binary_iarchive都从它的子类派生而来。通过对象反序列化时会调用它的load_object方法,而通过指针反序列化是会调用它的load_pointer方法。这个load_pointer方法有一段代码如下:if(! tracking){ bpis_ptr-&load_object_ptr(ar, t, co.file_version);}else{ serialization::state_saver&void *& x(pending_object); serialization::state_saver&const basic_iserializer *& y(pending_bis); serialization::state_saver&version_type& z(pending_version); pending_bis = & bpis_ptr-&get_basic_serializer(); pending_version = co.file_ // predict next object id to be created const unsigned int ui = object_id_vector.size(); serialization::state_saver&object_id_type& w_end(moveable_objects_end); // because the following operation could move the items // don't use co after this // add to list of serialized objects so that we can properly handle // cyclic strucures object_id_vector.push_back(aobject(t, cid)); bpis_ptr-&load_object_ptr(
object_id_vector[ui].address,&
co.file_version ); t = object_id_vector[ui]. object_id_vector[ui].loaded_as_pointer = assert(NULL != t);}&& & & &如果指针指向的对象是第一次被序列化,那么它将执行else分支,关键就在这个bpis_ptr-&load_object_ptr函数调用,这个函数的实现代码如下:template&class Archive, class T&BOOST_DLLEXPORT void pointer_iserializer&Archive, T&::load_object_ptr(&& &basic_iarchive & ar,&&& &void * & x,&& &const unsigned int file_version) const{&& &Archive & ar_impl =&&& & & &boost::serialization::smart_cast_reference&Archive &&(ar);&& &//此处将为对象分配内存,使用一个只能指针封装指针&& &auto_ptr_with_deleter&T& ap(heap_allocator&T&::invoke());&& &if(NULL == ap.get())&& & & &boost::serialization::throw_exception(std::bad_alloc()) ;&& &//将申请的地址赋值给t&& &T * t = ap.get();&& &x =&& &// catch exception during load_construct_data so that we don't&& &// automatically delete the t which is most likely not fully&& &// constructed&& &BOOST_TRY {&& & & &// this addresses an obscure situtation that occurs when&&& & & &// load_constructor de-serializes something through a pointer.&& & & &ar.next_object_pointer(t);&& & & &//从数据文档中载入数据初始化t所指向的内存&& & & &boost::serialization::load_construct_data_adl&Archive, T&(&& & & & & &ar_impl,&& & & & & &t,&&& & & & & &file_version&& & & &);&& &}&& &BOOST_CATCH(...){&& & & &//这里有内存泄漏的嫌疑吧??&& & & &ap.release();&& & & &BOOST_RETHROW;&& &}&& &BOOST_CATCH_END&& &ar_impl && boost::serialization::make_nvp(NULL, * t);&& &//智能指针解引用,该只能指针将不再拥有该指针&& &ap.release();}&& &&heap_allocator&T&::invoke()实现代码如下:struct has_new_operator { static T* invoke() {
return static_cast&T *&((T::operator new)(sizeof(T))); }};//如果T类型没有重载new运算符,那么就调用全局new运算符struct doesnt_have_new_operator { static T* invoke() {
return static_cast&T *&(operator new(sizeof(T))); }};//如果T类型重载了new运算符,那么就调用T重载的new运算符static T * invoke() {&& & & &//判断T类是否重载了new运算符而选择不同的invoke函数 typedef BOOST_DEDUCED_TYPENAME
mpl::eval_if&
boost::has_new_operator&T&,
mpl::identity&has_new_operator &,
mpl::identity&doesnt_have_new_operator & & &
&:: return typex::invoke();}&& & & 因为程序中并没有看到使用new函数来申请内存,因此程序员可能忘记释放内存。如果使用指针反序列化,那么一定要记得在合适的地方释放内存。
阅读(1124)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_080',
blogTitle:'Boost通过指针反序列化对象时代码分析(一)',
blogAbstract:'&& & & 通过指针反序列化对象,涉及到内存的分配问题。Boost只管申请内存,对于内存的释放则交给程序员自己来处理。下面只分析简单对象的指针反序列化代码,涉及到比较复杂的指针,比如指向派生类对象的基类指针代码要更复杂一些。&& & & Boost Serialization中的类继承关系比较清晰,不过接口让我感觉有点晕。basic_iarchive_impl是一个很重要的类,它是一个比较底层的基类,text_iarchive和binary_iarchive都从它的子类派生而来。通过对象反序列化时会调用它的load_object方法,而通过指针反序列化是会调用它的load_pointer方法。这个load_pointer方法有一段代码如下:',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:7,
publishTime:7,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}boost-serialization+variant_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
boost-serialization+variant
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩25页未读,继续阅读
你可能喜欢当前访客身份:游客 [
求评论啊!
:感谢。书上不说清楚,真讨厌。
:引用来自“zhaoxj”的评论 抄代码……好吧,长姿...
:抄代码……好吧,长姿势了。还不如抄单词去了,还...
:今天遇到一个自称北大青鸟的,神坑
:引用来自“marsgodares”的评论 遇到你这样的员工...
:不是坑, 是TMD相当坑...
:听说过有培训,没见过,曾经也是中软国际的一名员工
:遇到你这样的员工才坑爹
今日访问:0
昨日访问:7
本周访问:53
本月访问:73
所有访问:11846
boost 序列化
发表于1年前( 19:52)&&
阅读(270)&|&评论()
0人收藏此文章,
boost::archive::archive_exception at memory location 0x0017eb30
在这边记录一下今天做boost序列化的记录。
只做一下简要记录,不多赘述。因为咱是看
博客学的,多的不会讲。
首先,我从这个博客开始学boost的序列化。
讲得挺详细的,基本是按照外文博客翻译的。
代码写出来以后,出了这个异常:
boost::archive::archive_exception at memory location 0x0017eb30
然后我又看了以下几个博客:
把这个问题解决了。
另外咱是把数据序列到文件的 ,对stream这块不是很熟,看了以下博客
以下附简要代码
#include&&boost/serialization/base_object.hpp&&&&
#include&&boost/serialization/serialization.hpp&
#include&&boost/serialization/export.hpp&&
#include&&boost/serialization/list.hpp&//序列化list的头文件
#include&&boost/serialization/shared_ptr.hpp&//序列化share_ptr的头文件
#include&&boost/archive/binary_iarchive.hpp&//二进制的序列化头文件
#include&&boost/archive/binary_oarchive.hpp&&
#include&&iostream&
#include&&fstream&
#include&&sstream&
#include&&string&&
&friend&class&boost::serialization::&
&template&class&Archive&&&
&void&serialize(Archive&&ar,&const&unsigned&int&version){}&&
class&B:&public&A{&
&friend&class&boost::serialization::&
&template&class&Archive&&&
&void&serialize(Archive&&ar,&const&unsigned&int&version)
&&ar&&&BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);//序列化父类
&&ar&&&BOOST_SERIALIZATION_NVP(num);
//head.cpp
BOOST_SERIALIZATION_ASSUME_ABSTRACT(ENCPaintElement)&&&&&&&&//声明这个类是基类
BOOST_CLASS_EXPORT(ENCPointElement)&&&&&&&&&&&&&&&&&&&&&&&&&//声明这个类是子类
//main.cpp&
void&SaveElementToFile(&const&wstring&&fileName&/*=&wxT("test.txt")*/&)
&if(m_pInstance&==&NULL)&&
&std::ofstream&
&fout.open(fileName&,&ios::trunc&|&ios::out&|&ios::binary);
&if(!fout.is_open())
&&boost::archive::binary_oarchive&binary_oa(fout);
&binary_oa.template&register_type&B&(NULL);//这里要注意,“实例化”B类
&binary_oa&&&&BOOST_SERIALIZATION_NVP(m_list);//m_list保存的指向B类A类指针&;
&fout.close();//关闭文件
void&LoadElementFromFile(&const&wstring&&fileName&/*=&wxT("test.txt")*/&)
&std::ifstream&
&fin.open(fileName&,&ios::in&|&ios::binary);
&if(!fin.is_open())
&boost::archive::binary_iarchive&binary_ia(fin);
&binary_ia.template&register_type&B&(NULL);
&binary_ia&&&&BOOST_SERIALIZATION_NVP(m_list)&;
&fin.close();//关闭文件
更多开发者职位上
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读}

我要回帖

更多关于 boost 序列化 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信