unordered_map.find()匹配不同的键

时间:2017-07-17 19:25:45

标签: c++ dictionary stl unordered-map

我正在学习C ++。 我有这个方法在std::unordered_map中查找一个键,如果找到键则返回true,如果找不到则返回false。

bool BufferContainer::contains(std::string *file_path) {
    EditorBuffer *buf = lookup_buffer(file_path);
    if (buf != NULL)
        return true;
    return false;
}

EditorBuffer* BufferContainer::lookup_buffer(std::string *key) {            
     auto buffer = buffer_map.find(key);
     if (buffer == buffer_map.end())
          return NULL;
     return buffer->second;
}

我还有一些测试这些方法的代码。它添加一个缓冲区,然后查看其他字符串指针是否匹配。

TEST(BufferContainer, NotContainsBuffer) {
    std::string name = "buffer";
    std::string name2 = "buffer2";
    BufferContainer container;

    container.open_buffer(&name);
    EXPECT_FALSE(container.contains(&name2));
} 

现在的问题是,此测试失败了。如果我在堆上创建字符串,测试将按预期成功。

TEST(BufferContainer, NotContainsBuffer) {
    std::string *name = new std::string("buffer");
    std::string *name2 = new std::string("buffer2");
    BufferContainer container;

    container.open_buffer(name);
    EXPECT_FALSE(container.contains(name2));
}

这个问题有解决办法还是我做错了什么? 也许我应该将实际的字符串存储为键,但在我看来,这将是一个很大的开销。

编辑:我知道我比较地址,但我无法在最小的工作示例中重新创建此问题。

这是完整的"程序"。 测试在test/testeditor/test_buffer_container.cpp。 容器的代码位于libeditor/buffer_container.cpphttps://github.com/FlexW/tedit

1 个答案:

答案 0 :(得分:0)

BufferContainer为其地图使用全局变量,而不是与特定的BufferContainer实例相关联。一个测试插入的条目在另一个测试中可见。那张全球地图充斥着悬垂的指针。

恰好,name2测试中的NotContainsBuffer落在与先前测试中插入地图的字符串相同的堆栈位置。