准确来说,这篇博文并不是译文,而是一篇某个网页中代码改写而来。原文章中的代码存在几处严重错误,网页又不提供留言功能(不是没有而是一个没有留言功能的留言板)。4年过去了,作者对这些错误不更正让人无法接受。遂在此“翻译”之。原网址:点击打开链接

此代码是用来解决Boost库中持久化内存问题(主要是内存泄露)。代码如下:

#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <cstdlib>
#include <boost/tr1/memory.hpp>
#include <vector>
#include <map>
#include <boost/tr1/unordered_map.hpp>
#include <memory>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/split_free.hpp> using namespace std;
using namespace boost::serialization; namespace boost
{
namespace serialization
{
//implement serialization for auto_ptr<T>
//note: this must be added to the boost namesapce in order to
//be called by the libary
template< typename Archive, typename T>
inline void save( Archive &ar, const std::auto_ptr<T> &t, const unsigned int file_version)
{
//only the raw pointer has to be saved
cont T *const tx = t->get();
ar << tx;
} template <typename Archive, typename T>
inline void load(Archive &ar, std::auto_ptr<T> &t, const unsigned int file_version)
{
T *pTarget;
ar >> pTarget;
//note that the reset automagically maintains the reference count
#if BOOST_WORKAROUND (BOOST_DINKUMWARE_STDLIB, ==1)
t->release();
t = std::auto_ptr<T>(pTarget);
#else
t->reset(pTarget);
#endif
}
//split non-instrusive serialization function member into sparate
//non intrusive asve/load member functions
template<typename Archive, typename T>
inline void serialize(Archive &ar, std::auto_ptr<T> &t, const unsigned int file_version)
{
boost::serialization::split_free(ar, t, file_version);
}
}// namespace serialization
}//namespace boost //举例说明简单类型的序列化
class gps_position
{
private:
friend class boost::serialization::access; template<typename Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & degrees;
ar & minutes;
ar & seconds;
}
int degrees;
int minutes;
float seconds;
public:
gps_position()
{
degrees = 0;
minutes = 0;
seconds = 0.0f;
}
gps_position(int d, int m, float s):
degrees(d),minutes(m),seconds(s) { }
}; class bus_stop
{
friend class boost::serialization::access;
template <typename Archive>
void serialize( Archive &ar, const unsigned int version )
{
ar & latitude;
ar & longitude;
}
gps_position latitude;
gps_position longitude;
public:
bus_stop() { }
bus_stop(const gps_position &lat_, const gps_position &long_):
latitude(lat_), longitude(long_) { }
virtual ~bus_stop() { }
}; class bus_stop_corner:public bus_stop
{
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
// 序列化基类信息
ar & boost::serialization::base_object<bus_stop>(*this);
ar & street1;
ar & street2;
}
std::string street1;
std::string street2; public:
bus_stop_corner() { }
bus_stop_corner(const gps_position & lat_, const gps_position & long_,
const std::string & s1_, const std::string & s2_) :
bus_stop(lat_, long_), street1(s1_), street2(s2_) { } virtual std::string description() const
{
return street1 + " and " + street2;
}
~bus_stop_corner() { }
}; class bus_route
{
friend class boost::serialization::access;
//相对于BoostLearn03,此处改写是为了减少代码量并显示更清楚
boost::shared_ptr<bus_stop_corner> msptrBusStop;
boost::shared_ptr<bus_stop_corner> maptrBusStop; template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & msptrBusStop;
ar & maptrBusStop;
}
public:
bus_route(bus_stop_corner *apStop1, bus_stop_corner *apStop2)
:msptrBusStop(apStop1/*new bus_stop_corner(apStop1)*/),
maptrBusStop(apStop2/*new bus_stop_corner(apStop2)*/)
{ }
bus_route()
{ }
~bus_route()
{ }
}; int main(void)
{
std::ofstream ofs("bus_route");
//创建类实例
const gps_position latitude(1, 2, 3.3f);
const gps_position longitude(4, 5, 6.6f); //注解1:
bus_stop_corner *lpStop1 = new bus_stop_corner(latitude, longitude, "corn1", "corn2");
bus_stop_corner *lpStop2 = new bus_stop_corner(latitude, longitude, "corn3", "corn4"); //注解2:
bus_route route(lpStop1, lpStop2); {
boost::archive::text_oarchive oa(ofs);
oa << route;
} bus_route new_route;
{
std::ifstream ifs("bus_route", std::ios::binary);
boost::archive::text_iarchive ia(ifs);
ia >> new_route;
}
//当智能指针的引用计数为0时,内存会被释放.
return 0;
}

在修改原来的代码是发现一个弄不明白的地方,如进行下面的更改后便出现 “Expression:_BLOCK_TYPE_IS_VALID (pHead->nBlockUse)”错误.

1.代码中"注解①"处若换成如下两行代码

    bus_stop_corner lpStop1 (latitude, longitude, "corn1", "corn2");
bus_stop_corner lpStop2 (latitude, longitude, "corn3", "corn4");

2."注解②"处换成

bus_route route(&lpStop1, &lpStop2);

3.运行时出现"“Expression:_BLOCK_TYPE_IS_VALID (pHead->nBlockUse)”错误".

为什么出现如此现象我也不能可定。猜测:

对比发现,一个是构造函数构造出来的,另一个是用new运算符分配的内存。构造函数构造对象时分配的内存由析构函数负责完成内存释放,new运算符分配的内存通过delete运算或是通过智能指针的引用计数来释放。

这个猜测还需验证,现记录在此,以后有能力证明这个猜测再来完善。 2013-11-15

Boost的Serialization和SmartPoint搭配使用的更多相关文章

  1. 最经常使用的两种C++序列化方案的使用心得(protobuf和boost serialization)

    导读 1. 什么是序列化? 2. 为什么要序列化?优点在哪里? 3. C++对象序列化的四种方法 4. 最经常使用的两种序列化方案使用心得 正文 1. 什么是序列化? 程序猿在编写应用程序的时候往往须 ...

  2. 最常用的两种C++序列化方案的使用心得(protobuf和boost serialization)

    导读 1. 什么是序列化? 2. 为什么要序列化?好处在哪里? 3. C++对象序列化的四种方法 4. 最常用的两种序列化方案使用心得 正文 1. 什么是序列化? 程序员在编写应用程序的时候往往需要将 ...

  3. boost asio 异步实现tcp通讯

    ---恢复内容开始--- asioboost   目录(?)[-] 一前言 二实现思路 通讯包数据结构 连接对象 连接管理器 服务器端的实现 对象串行化   一.前言 boost asio可算是一个简 ...

  4. Boost 序列化

    原文链接: https://blog.csdn.net/qq2399431200/article/details/45621921 1. 编译器 gcc, boost 1.55 2.1第一个简单的例子 ...

  5. boost--序列化库serialization

    序列化可以把对象转化成一个字节流存储或者传输,在需要时再回复成与原始状态一致的等价对象.C++标准没有定义这个功能.boost.serialization以库的形式提供了这个功能,非常强大,可以序列化 ...

  6. Boost Asioserver使用

    今天主要想说道说道boost里面的网络通信库怎样设计和使用,由于近期一直在和网络一起工作,大数据处理和机器学习都离不开最后使用网络进行上线部署.先看看所有的源码吧. #include <cstd ...

  7. 如何在C++中使用boost库序列化自定义class ?| serialize and deserialize a class in cpp with boost

    本文首发于个人博客https://kezunlin.me/post/6887a6ee/,欢迎阅读! serialize and deserialize a class in cpp Guide how ...

  8. Serializable unordered set

    Serializable unordered set 可序列化哈希set #include <boost/algorithm/string/predicate.hpp> #include ...

  9. QxOrm 1.2.9 下载 以及编译方法 简介.

    QxOrm 是一个基于QT开发的数据库方面的ORM库,功能很强大,是QT C++数据开发方面的好工具. 目前已经更新1.3.1 .但 不幸的是 它的官网http://www.qxorm.com/ 莫名 ...

随机推荐

  1. bzoj2241: [SDOI2011]打地鼠

    暴力. O(n^6)暴力卡过,72ms. 莫名其妙做这道题时感觉十分烦躁,难受,只能这样了. O(n^4)的方法是这样差分一下.判断的时候tmp=t[i][j],t[i][j]-=tmp,t[i+r] ...

  2. oracle 11g rac 无法自动启动

    如果以上的操作依然不能使数据库资源自动启动,那么参考下面这篇文章修改资源AUTO_START属性. 查看资源状态: crsctl status resource 资源       -p     crs ...

  3. codevs 1171 潜伏者

    要是NOIP自己这样水就完了... 仔细啊!!!! #include<iostream> #include<cstdio> #include<cstring> #i ...

  4. UVA 11090 Going in Cycle!! 环平均权值(bellman-ford,spfa,二分)

    题意: 给定一个n个点m条边的带权有向图,求平均权值最小的回路的平均权值? 思路: 首先,图中得有环的存在才有解,其次再解决这个最小平均权值为多少.一般这种就是二分猜平均权值了,因为环在哪也难以找出来 ...

  5. webapp调试工具weinre的使用

    在设计师与前端开发人员的努力下,一个WebApp出炉了,可是测试人员说了一堆的问题:某某机型下页面表现不一致,某某系统下页面如何如何,某某 系统浏览器下页面怎么怎么滴.看着满满的测试汇总文档,我们曾经 ...

  6. 域名下Web项目重定向出现DNS域名解析错误问题

    问题: 项目使用的是阿里云的ESC,前几天为IP地址添加了域名 发现发送正常请求时跳转没问题,但发送重定向请求时,页面就会出现DNS域名解析错误的情况 1.我在Tomcat的server.xml中配置 ...

  7. ubuntu-12.04.1-desktop-x64下JDK环境的安装与配置

    1.上oracle官网下载最新的JDK.在这里,我的系统是ubuntu-12.04.1-desktop-amd64,目前位置JDK的最新版本位7u9.jdk-for-linux有两种安装包,一种是rp ...

  8. JUC之Atomic系列12大类实例讲解和原理分解

    在java6以后我们不但接触到了Lock相关的锁,也接触到了很多更加乐观的原子修改操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,以及并发中的AB ...

  9. 基于Fragment实现Tab的切换,滑出侧边栏

    最近在学习Fragment(碎片)这是android3.0以后提出的概念,很多pad上面的设置部分都是通过Fragment来实现的,先看看具体的效果吧(图一)  (图二) (图三)第一章图片是初始时的 ...

  10. ExcelUtils 导表实例

    @RequestMapping("/dealer/chargebook/exportv.htm")    public void getChargeBookList(int epm ...