在c ++中,我想序列化我的类变量,但是有两个问题

问题描述 投票:0回答:1

我想序列化我的课程,但是我有两个问题。

首先,我将展示我的课程。

namespace CommonData
{
    enum DataType { SHPERICAL, COORDINATE, VIEW };

    class Data
    {
    public:
        virtual int serialize(char** param) = 0;

    protected:
        //every size is byte unit
        int initialize(char** param, int size);

        int fill(char** param, int start, int size, void* src);

    private:
        DataType _type;
    };

    class CoordinateData : public Data
    {
    public:
        int serialize(char** param) override;

    private:
        int _x, _y, _z;
    };
};

这是cpp代码

int Data::initialize(char** param, int size)
{
    *param = new char[size];
    cout << "size : " << size << endl;

    return fill(param, 0, sizeof(DataType), &_type);
}

int Data::fill(char** param, int start, int size, void* src)
{
    char* p = reinterpret_cast<char*>(src);

    int i = 0;
    while(i < size)
    {
        cout << "i : " << i << endl;
        cout << "*(p + i) : " << (int)*(p + i) << endl;
        *param[start + i] = *(p + i);
        cout << "*param[start + i] : " << (int)*param[start + i] << endl;
        i++;
        cout << "==============" << endl;
    }

    return start + size;
}

int CoordinateData::serialize(char** param)
{
    int end = 0;

    end = initialize(param, sizeof(CoordinateData));

    return end;
}

所以,如果我这样启动主代码

int main()
{
    char* arr = nullptr;

    CommonData::CoordinateData _coor(1, 2, 3);

    int size = _coor.serialize(&arr);
}

控制台输出是这样的。

size : 20
i : 0
*(p + i) : 1
*param[start + i] : 1
==============
i : 1
*(p + i) : 0
*param[start + i] : 0
==============
i : 2
*(p + i) : 0

我的第一个问题是,为什么CoordinateData类的大小为20?我预计它将是16(枚举DataType _type,int _x,_y,_z-> 4 * 4 = 16字节)

其次是填充功能不起作用。我删除了一些打印功能,但是当我检查要访问* param [start + i = 2]时,可能会出现垃圾值,但是当我运行主代码时,它们就那样完成了。

我听说c ++可以在每个代码中访问原始内存地址,而无需保证程序的安全性。因此它不能抛出内存不足错误,我认为char * arr是堆内存,因此不会在代码或数据区域的内存中进行访问,但是它只是关闭了。为什么会这样?

c++ serialization out-of-memory heap-memory memory-address
1个回答
1
投票

[operator[]具有比operator*高的优先级。

换句话说,您需要做

(*param)[start + i] = *(p + i);
© www.soinside.com 2019 - 2024. All rights reserved.