c++ - 如何使用构造函数外部分配的 Boost 序列化大型 malloc'ed float 数组?

标签 c++ boost

<分区>

由于某些限制,我不得不为我的一个库使用 C float 组。该数组在经过一些处理后被 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 序列化的幕后情况。这对我来说只是一个黑盒子。我是初学者,无法阅读其源代码。

最佳答案

根据 this answer ,你可以这样做:

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);
}

关于c++ - 如何使用构造函数外部分配的 Boost 序列化大型 malloc'ed float 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32489850/

相关文章:

java - 如何使用 JNI 从 native C/C++ 代码调用 Java applet 回调函数。

c++ - 与 "math.h"的链接错误 - 告诉链接器与其链接的选项是什么?

c++ - 无论编码如何,从 wifstream 中提取正确的文本

c++ - 如何检查从键盘输入的特定整数值是否存在于 C++ 文件的一行或多行中

c++ - gSOAP 指定访问控制允许来源

c++ - 在编译期间使用#pragma message() 打印#define 的完全评估结果

c++ - 遍历 boost::multi_array 的维度

c++ - std::vector<bool> 只有一个真元素

c++ - Dijkstra 图在每条边上都有一个权重表

c++ - 使用 mpl::if_ 和整数模板参数选择类型