从构造函数执行时,包含对象的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
是先构建的。
答案 0 :(得分:0)
更喜欢使用std :: vector或Boost.Array而不是普通数组,你会有更少的内存问题......而且它们实际默认构造它们所拥有的对象,因此它将保存一些代码行。
我认为load
是objectArray
的方法,我想知道为什么你实际上这样称呼它:
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
}