如何在构造函数外部分配 Boost 的情况下序列化大型错误定位浮点数组?
How to serialize large malloc'ed float array with Boost allocated outside of constructor?
由于某些限制,我被迫为我的一个库使用C浮点数组。经过一些处理后,该数组被malloc。如何在serialize()
方法中分配内存?
如果您将malloc从init()
移动到构造函数,则代码可以工作。
#include <iostream>
#include <fstream>
#include <cstdlib>
#pragma warning(disable: 4244)
#include <boost/serialization/serialization.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
struct Monkey
{
int num = 256*70000;
float* arr;
Monkey()
{}
void init() {
arr = (float*)malloc(num*sizeof(float));//new float[num];
}
~Monkey() { free(arr); }
};
namespace boost
{
namespace serialization
{
template<class Archive>
void serialize(Archive & ar, Monkey& m, const unsigned int version)
{
ar & m.num;
ar & make_array<float>(m.arr, m.num);
}
}
}
int main(int argc, char* argv[])
{
const char* name = "monkey.txt";
{
Monkey m;
m.init();
std::ofstream outStream(name, std::ios::out | std::ios::binary | std::ios::trunc);
boost::archive::binary_oarchive oar(outStream);
oar << (m);
}
Monkey m;
std::ifstream inStream(name, std::ios::in | std::ios::binary);
boost::archive::binary_iarchive iar(inStream);
iar >> (m);
//std::copy(m.arr, m.arr + m.num, std::ostream_iterator<float>(std::cout, ";"));
std::cout << m.arr[10] << std::endl;
}
老实说,我真的不知道boost序列化到底是怎么回事。对我来说就是个黑盒子。
根据这个答案,你可以这样做:
template<class Archive>
void serialize(Archive & ar, Monkey& m, const unsigned int version)
{
ar & m.num;
if (Archive::is_loading::value)
{
assert(m.arr == nullptr);
m.arr = new float[m.num];
}
ar & make_array<float>(m.arr, m.num);
}
相关文章:
- NS3 - python.h 文件无法定位编译错误
- 设置我的应用程序 API 感知并防止系统使其模糊和错误定位
- c++ 链接器错误"针对'.rodata.str1.1'的重新定位R_X86_64_32"链接 CXX 共享库 libsrt.so
- R 包安装错误:重新定位 0 具有无效的符号索引 11
- Visual Studio 2019 不会打开包含源文件的窗口,也不会定位为出现错误的行
- 在函数内部错误定位后,从函数中释放返回的指针会导致芯片崩溃
- llvm错误:重新定位尚未实现!在orcjit或lli中运行RxCpp时
- 从函数返回错误定位的指针,是否会导致内存泄漏
- TC++PL书中练习中向量ctor的定位错误
- 将 std::vector 的缓冲区替换为错误定位的字符数组
- 打印以定位错误代码块
- 无法编译和定位错误
- C++ Qt MingW 错误的重新定位0xc rdata 部分中的地址
- 错误的重新定位地址0x0在 python.data C 扩展中
- 链接器错误:未定义的引用/错误的重新定位地址/ld返回1个出口
- 如何定位WinRT异步方法调用中出现错误的位置
- libstdc++.so.6的重新定位错误
- 无法定位错误cpp linux
- 使用extern时gcc的重定位错误
- 对话框定位错误