关于 boost 库: boost::archive::binary_iarchive,关于内存分配 高手快来

starnight1981 2010-10-25 10:44:16
是这样的,我正在开发一个 第三方软件的插件 ,插件其实就是一个 动态库(dll) ,我们可以就把它当作 一个 dll 来看待:

在开发插件的时候, 需要序列化, 我第一时间就是想到了用 boost 库的序列化。但是问题来了。

在我需要用到 boost序列化库的 源码中,包含 序列化头文件
#include <boost/serialization/access.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>

然后在函数中写了这个:
std::ifstream ifs("d:\\haha.bin");
boost::archive::binary_iarchive ia(ifs);

运行应用程序的时候,这个插件就不能正确加载。

问题就出在 上面 红色颜色 的代码, 将这行代码去掉就没有事情了。

经过调试分析,程序根本就没有运行到这个代码,说得更明白点, 连 dll 的入口函数都没有进来。
根据主程序加载 这个 dll失败后,给出的提示: 是因为内存分配失败还是泄漏什么的,并抛出了一个异常

the 0x75a0b727 of the most likely exception: Microsoft C + + exception: the memory location 0x0018f404 at std:: bad_alloc.

因为上面加的那行代码,是放在一个函数里面的,是个局部变量。 但是程序根本就没有运行到这里来。为什么会出现内存错误呢?
我想可能是有这样的问题: boost::archive::binary_iarchive 这个类里面可能有些 静态全局变量, 在构造这个类的对象之前,就已经先构造了这部分静态全局变量,而这部分 静态全局变量,可能用到了自己的内存分配方式,导致主应用程序无法去管理这部分内存。

但是我观摩了 一下 boost::archive::binary_iarchive 这个类,并没有发现什么地方用到了这个静态全局变量。 难道是我的思路出现了错误? 或者是 在动态库里面不能这样调用 boost 序列化库,或者是还要加上一些其他的参数?

这个问题已经困扰了我3天3夜,在我百思不得其解的情况下,我只好把它搬上到伟大的CSDN,把它呈献到各位大侠面前,希望在这里能碰到大师,给我指明前进的道路。

附: 我的 dll 是采用的 静态链接到 boost 序列化库的。
...全文
1268 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
starnight1981 2010-10-27
  • 打赏
  • 举报
回复
都2天了怎么还是没有碰到高人哦
starnight1981 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jwybobo2007 的回复:]
必须先有序列化出去的文件

std::ofstream ofs("d:\\haha.bin");
boost::archive::binary_iarchive oa(ofs);
int i = 100;
oa << i;

不然在构造的时候,发现d:\\haha.bin存在(或不存在)但数据格式不合法,就抛出异常
[/Quote]

此言差矣。

正常情况下,
不管 d:\\haha.bin 存不存在,数据合法与否,
boost::archive::binary_iarchive oa(ofs);
这个都不会抛出异常,它仅仅只是构造了一个对象而已

如果 d:\\haha.bin 不存在,或者里面的数据有误,

oa << i; 这个才会抛出异常


还有,你上面的代码也写错了,正确的应该是

std::ifstream ofs("d:\\haha.bin");
boost::archive::binary_iarchive oa(ofs);
int i = 100;
oa >> i;



std::ofstream ofs("d:\\haha.bin");
boost::archive::binary_oarchive oa(ofs);
int i = 100;
oa << i;





jwybobo2007 2010-10-25
  • 打赏
  • 举报
回复
必须先有序列化出去的文件

std::ofstream ofs("d:\\haha.bin");
boost::archive::binary_iarchive oa(ofs);
int i = 100;
oa << i;

不然在构造的时候,发现d:\\haha.bin存在(或不存在)但数据格式不合法,就抛出异常
Yofoo 2010-10-25
  • 打赏
  • 举报
回复
抛出的异常可以设置VS捕捉, 不过dll没完全加载可能会没调试信息, 自己看callstack,汇编...
starnight1981 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zyyoung 的回复:]
boost::archive::binary_iarchive ia(ifs);
虽然不懂,但这句话 可能是同步、阻塞操作
[/Quote]


看来你是真不懂
zyyoung 2010-10-25
  • 打赏
  • 举报
回复
boost::archive::binary_iarchive ia(ifs);
虽然不懂,但这句话 可能是同步、阻塞操作
starnight1981 2010-10-25
  • 打赏
  • 举报
回复
放一天了,竟然没人抢沙发,悲哀

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧