如何在构造函数外部分配 Boost 的情况下序列化大型错误定位浮点数组?

How to serialize large malloc'ed float array with Boost allocated outside of constructor?

本文关键字:定位 错误 大型 数组 序列化 情况下 构造函数 外部 分配 Boost      更新时间:2023-10-16

由于某些限制,我被迫为我的一个库使用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);
}