首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >指针的向量。增强序列化

指针的向量。增强序列化
EN

Stack Overflow用户
提问于 2012-06-08 00:31:23
回答 2查看 2.3K关注 0票数 3

我想使用BOOST来序列化/反序列化以下向量中的对象的值(而不是指针):

代码语言:javascript
运行
复制
std :: vector <A*> m_vector; 

为了实现序列化,我使用了以下代码:

代码语言:javascript
运行
复制
int nItems = m_vector.size();
ar & nItems;
std::for_each(m_vector.begin(), m_vector.end(), [&ar](A* pItem) {
    ar & *pItem;
});

并进行反序列化:

代码语言:javascript
运行
复制
int nItems;
ar & nItems;
for (int i = 0; i < nItems; ++i) {
    A* pItem;
    ar & *pItem;  ///////////// Run-Time Check Failure #3
    m_vector.push_back(pItem);
}

但是当我运行这个程序时,我得到了以下错误:

代码语言:javascript
运行
复制
Run-Time Check Failure # 3 - The variable 'pItem' is Being Used without Being initialized. 

我做错了什么?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2012-06-08 00:34:12

您将需要为pItem指向的对象分配内存

代码语言:javascript
运行
复制
A* pItem = new A;
ar & *pItem;
m_vector.push_back(pItem);

错误是因为虽然您有一个指针,但是在指针所指向的内存位置上没有对象--指针的值是垃圾(未初始化的指针)。

当你不再需要向量中指针指向的对象时,不要忘记调用delete来防止内存泄漏。更好的是,使用智能指针(例如boost::shared_ptr<>)来确保内存在不再可访问时被释放。

票数 5
EN

Stack Overflow用户

发布于 2014-04-21 22:45:12

2年后,但值得一提的是。

有一个更好的解决方案来序列化指向对象或任何其他容器(list,set等)的STL指针向量。为了序列化一个向量,添加:

代码语言:javascript
运行
复制
#include <boost/serialization/vector.hpp>

然后,您需要实现serialize()方法,并将您的类与archieve加为好友。本例中解释了所有内容(请仔细阅读所有注释,它们非常重要):

代码语言:javascript
运行
复制
#include <fstream>
#include <iostream>
#include <vector>
#include <iostream>

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/vector.hpp>


class Abc{
    // In order to make Abc serializable
    // you need to friend this lass with serialization::access
    friend class boost::serialization::access;

    // and then add this method
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        // choose what class fields do you want to serialize
        ar & a;
        ar & b;
        ar & c;
    }
public:
    int a;
    int b;
    int c;

    // don't forget about default constructor! It's necessary for serialization!
    Abc(){};
    Abc(int a, int b, int c): a(a), b(b), c(c){};
};

class GpsPosition
{
private:
    // as mentioned above...
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & degrees;
        ar & minutes;
        ar & seconds;
        ar & wektorIntow;
    }
    int degrees;
    int minutes;
    float seconds;
public:
    std::vector<Abc*> abcVector;
    GpsPosition(){};
    GpsPosition(int d, int m, float s): degrees(d), minutes(m), seconds(s)
    {
        // adding some objects to abcVector
        abcVector.push_back(new Abc(1, 2, 3));
        abcVector.push_back(new Abc(3, 2, 3));
        abcVector.push_back(new Abc(2, 2, 3));
        abcVector.push_back(new Abc(1, 2, 3));
    }
    int getDegrees(){ return this->degrees; }
    int getMinutes(){ return this->minutes; }
    float getSeconds(){ return this->seconds; }
};

int main(){

    // And now how to use it

    // Saving to file:
    std::ofstream fileHandler("filename");
    const GpsPosition position1(35, 59, 24.567f);
    {
        boost::archive::text_oarchive boostOutputArchieve(fileHandler);
        boostOutputArchieve << position1;
    }

    // Reading from file:
    GpsPosition newPosition;
    {
        std::ifstream fileHandler;
        try{
            fileHandler.open("filenacme");
            boost::archive::text_iarchive boostInputArchieve(fileHandler);
            // read class state from archive
            boostInputArchieve >> newPosition;
            // archive and stream closed when destructors are called
            fileHandler.close();
            }
        catch (std::ifstream::failure e) {
            std::cerr << "Exception opening/reading/closing file";
        }
        catch(boost::archive::archive_exception e){
            std::cerr << "Exception opening/reading/closing file";
        }
    }

    // print to the console
    std::cout << newPosition.getMinutes() << std::endl; 
    std::cout << newPosition.abcVector[0]->a;
    std::cin.get();

    return 0;
}

有关更多信息,请查看本教程:http://www.boost.org/doc/libs/1_55_0/libs/serialization/doc/index.html

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10935982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档