从构造函数执行时,包含对象的Boost反序列化失败,否则会成功

时间:2009-10-28 21:18:29

标签: c++ serialization boost constructor

从构造函数执行时,包含对象的Boost反序列化失败,否则会成功。

E.G:

ContainingClass::ContainingClass() {
    pNA = new objectArray*[NUMBER]; // allocates ptrs
    // ...
    pNA[ii] = new objectArray(SIZE);// allocates object array, and object array
                                    // has a std::map "PatternsMap"
    // ...

    pNA[ii]->load(pNA[ii], "../release/NA Data/NAData_a description_NA0"); //fails
    pNA[ii]->PatternsMap.size(); //size = 0
}

如果我在构造函数退出后调用以下代码行,那么一切都很好:

pNA[ii]->load(pNA[ii], "../release/NA Data/NAData_a description_NA0"); //succeeds
pNA[ii]->PatternsMap.size();//size > 0

有什么想法吗?请注意,在构造函数示例中,我验证了objectArray是先构建的。

2 个答案:

答案 0 :(得分:0)

更喜欢使用std :: vector或Boost.Array而不是普通数组,你会有更少的内存问题......而且它们实际默认构造它们所拥有的对象,因此它将保存一些代码行。

我认为loadobjectArray的方法,我想知道为什么你实际上这样称呼它:

pNA[ii]->load(pNA[ii], "../release/NA Data/NAData_a description_NA0");

我的意思是,在使用方法时,你已经有一个引用该对象的隐式参数(this),不需要真正传递它两次(一次是隐式的,一次是显式的)。

当然,如果我们可以查看load方法,那将会有所帮助。诊断类型问题非常困难:

  

我的方法foo失败了,你知道为什么吗?

您越准确,就越有可能确切地确定您的问题。

答案 1 :(得分:0)

致:Stjepan Rajko: ContainingClass是在运行时动态创建的。

致Matthieu M: 似乎Boost的作者可能已陷入“全球初始化惨败”。

根据关于std :: vector的注释,我使用普通数组,因为代码是高度并行的,我期待将其中的一部分移动到NVidia的CUDA。 CUDA目前不支持C ++,只支持C.此外,(虽然不是一个因素)我感到非常放心使用动态数组并明确释放内存......加上性能是一个重中之重。我在我认为合适的地方使用了std :: vector和smart / auto ptrs。

根据关于隐含的评论,是的,你可能是正确的......当我明确表达时,我不确定我在想什么。以下是objectArray类中的序列化代码:

模板[类存档] //注意必须为此帖更改行车

void serialize(Archive& ar,const unsigned int version) {

//仅为新档案保存/加载A_name

// if(version> 0)

// ar& A_name;

ar& PatternsMap;

}

void store(objectArray s,const char filename) {

// create and open a character archive for output
std::ofstream ofs(filename);
boost::archive::text_oarchive oa(ofs);
// write class instance to archive
oa << s;
// archive and stream closed when destructors are called

}

void load(objectArray s,const char filename) {

std::ifstream ifs(filename);
boost::archive::text_iarchive ia(ifs);
// read class state from archive
ia >> s;
// archive and stream closed when destructors are called

}