C ++对象更改是执行期间的地址

时间:2015-10-08 09:42:30

标签: c++ serialization boost

我正在使用Win7中的C ++。方案如下:

对象 - >二进制序列化 - >二进制反序列化 - >对象

对于序列化和反序列化,我们使用boost。

反序列化成功。但是当我们开始调用它的函数execute()时,在执行第一行之后它的所有数据都被破坏了。它在局部变量选项卡中注明了" this"地址自动更改。

进入功能后 After entering in the function

执行第一行功能后 After executing first line of function

这是源代码

  void NewFrameCommand::execute()
    {
        FrameStructure st = getStructure();

        setState(InExecution, S_OK, "Executing NewFrameCommand ...");
        unsigned long errorcode;
        SharedMemoryFrame* sharedFrame = getSharedFrame(errorcode);
        if (sharedFrame == nullptr)
        {       
            return;
        }

        Frame* grayScaleframe = sharedFrame->frame();
...
    }

头文件

中的序列化代码
class LPRCOMMANDS_API NewFrameCommand : public LPRCommandBase
        {
            friend class boost::serialization::access;
            template<class Archive>
            void serialize(Archive & ar, const unsigned int version)
            {
                ar & boost::serialization::base_object<LPRCommandBase>(*this);              
            }

        public:
            NewFrameCommand();
            ~NewFrameCommand();

            NewFrameCommand(const const FrameStructure& aGrayScaleStructure, const char* aGrayScaleMemoryName);

        public: //CommandBase implementation
            int id() const;
            virtual void execute();
            virtual void deserialize(const char* aData, const int aDataLength);
            virtual void serialize(char** aData, int& aLength) const;
        };

和基类

class LPRCOMMANDS_API LPRCommandBase : public Commands::CommandBase
        {
            friend class boost::serialization::access;
            template <class Archive>
            void serialize(Archive & ar, const unsigned int version)
            {
                ar & boost::serialization::base_object<CommandBase>(*this);
                ar & m_MemoryName;
                ar & m_Structure;
            }
...
}

知道如何发生这种情况以及如何解决这个问题。

此致 贾瓦德。

1 个答案:

答案 0 :(得分:0)

最后我发现了一个问题,然而,我仍然不知道为什么它仍然发生.. deserialize()函数导致了问题。

void NewFrameCommand::deserialize(const char* aData, const int aDataLength)
{
    //NewFrameCommand* temp = static_cast<NewFrameCommand *>(static_cast<void*>(const_cast<char*>(aData)));
    //*this = *temp; //copying data
    stringstream data;
    data.write(const_cast<char*>(aData), aDataLength);

    assert(aDataLength == data.str().size());

    boost::archive::binary_iarchive ia(data);
    ia >> *this;

    data.clear();
}

data.clear()被注释掉时,它开始正常工作。尽管data是在堆栈上创建的并且最终必须被销毁,但是对clear()的调用不会产生任何问题,因为ia >> *this;已经将数据复制到this

现在问题是,stringstream::clear()仅设置流的state,它是如何真正更改数据的。如果它改变了自己的数据,它怎么会改变其他对象this的数据。