void PersistentSkiplistWrapper::Init(const std::string& path, uint64_t size, int32_t max_height, int32_t branching_factor, size_t key_size, uint64_t opt_num,size_t per_1g_num) {
allocator_ = new PersistentAllocator(path, size);
for(auto list : skiplists_){
list = new Persistent_SkipList(allocator_, max_height, branching_factor, key_size, opt_num ,per_1g_num);
}
key_size_ = key_size;
}
这段代码写出来感觉没什么问题,但是运行的时候总有段错误,怎么也找不到问题在哪,最后发现skiplists里面的指针都是空指针,这就很怪了,明明有初始化,然后查文档才发现这种for循环的访问是迭代那种访问,然后我的理解是这种迭代就跟函数的值传递一样,list只是一个副本,for里面的修改只是对副本的修改,没有动真正的数据,所以才会造成for里面初始化了,但是除了for又全是空指针的问题!
void PersistentSkiplistWrapper::Init(const std::string& path, uint64_t size, int32_t max_height, int32_t branching_factor, size_t key_size, uint64_t opt_num,size_t per_1g_num) {
allocator_ = new PersistentAllocator(path, size);
for(auto &list : skiplists_){
list = new Persistent_SkipList(allocator_, max_height, branching_factor, key_size, opt_num ,per_1g_num);
}
key_size_ = key_size;
}
加个引用就完事了
(这就让我很怀念Rust了,Rust里面直接就是一个list的不可变引用,修改的时候编译器就给你不过,这C++就不告诉我,害我找半天(C++:怪我咯,是你太菜))
现在又遇到了第二个问题,有一个vector
pair(const std::pair<_T1, _T2>&) is implicitly deleted because the default definition...
查一了下发现原来是这样的for循环相当于会复制一份,而刚好pair中有unique_ptr不能被复制,所以就出错了,所以这个地方需要改成引用就没问题:for (auto &file : files)