我想使用BOOST来序列化/反序列化以下向量中的对象的值(而不是指针):
std :: vector <A*> m_vector; 为了实现序列化,我使用了以下代码:
int nItems = m_vector.size();
ar & nItems;
std::for_each(m_vector.begin(), m_vector.end(), [&ar](A* pItem) {
ar & *pItem;
});并进行反序列化:
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);
}但是当我运行这个程序时,我得到了以下错误:
Run-Time Check Failure # 3 - The variable 'pItem' is Being Used without Being initialized. 我做错了什么?
谢谢。
发布于 2012-06-08 00:34:12
您将需要为pItem指向的对象分配内存
A* pItem = new A;
ar & *pItem;
m_vector.push_back(pItem);错误是因为虽然您有一个指针,但是在指针所指向的内存位置上没有对象--指针的值是垃圾(未初始化的指针)。
当你不再需要向量中指针指向的对象时,不要忘记调用delete来防止内存泄漏。更好的是,使用智能指针(例如boost::shared_ptr<>)来确保内存在不再可访问时被释放。
发布于 2014-04-21 22:45:12
2年后,但值得一提的是。
有一个更好的解决方案来序列化指向对象或任何其他容器(list,set等)的STL指针向量。为了序列化一个向量,添加:
#include <boost/serialization/vector.hpp>然后,您需要实现serialize()方法,并将您的类与archieve加为好友。本例中解释了所有内容(请仔细阅读所有注释,它们非常重要):
#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
https://stackoverflow.com/questions/10935982
复制相似问题