今天在写bustub的bufferpool代码时候有一个非常奇怪的bug让我百思不得其解,我有一个unordered_map
叫做page_table
,用于映射bufferpool中的pageid和bufferpool中真实位子也就是下标frameid的我在unpin后自然而然的删除了这个键值对page_table.erase(0)
,在接下来的判断中FetchPg
的判断中page_table.count(0)
应该返回0为假,然后我从磁盘中拿相应的page到内存中,奇怪的是我erase后page_table.count(0)
为0没毛病,但是到Fetchpg
判断中page_table.count(0)
又变成了1,最后我发现是我在erase后调用flash函数(将脏数据刷入到磁盘中)flash函数调用了page_table[0]
(这里是bug)然后page_table.count(0)
就变成了1,为了复现,做了个实验,发现真的如此,所以后面我们将unordered_map.count()
写入if作为键值对存在判断的条件的时候一定要注意
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
unordered_map<int,char> umap1;
umap1[1] = 'a';
cout << "umap.count(1) is " << umap1.count(1) << "\n";
umap1.erase(1);
cout << "umap.count(1) is " << umap1.count(1) << "\n";
umap1[1];
cout << "umap.count(1) is " << umap1.count(1) << "\n";
return 0;
}
打印
umap.count(1) is 1
umap.count(1) is 0
umap.count(1) is 1