【问题标题】:unordered_map.find() matches on different keysunordered_map.find() 匹配不同的键
【发布时间】:2017-07-17 19:25:44
【问题描述】:

我正在学习 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

【问题讨论】:

  • 我们需要minimal reproducible example 才能为您提供帮助。另一方面,如果你学会了如何使用调试器来单步调试你的代码,你可以逐行执行你的程序,看看它在哪里偏离了你的预期。如果您要进行任何编程,这是必不可少的工具。延伸阅读:How to debug small programs
  • 你为什么到处使用指向std::string的指针?当您尝试比较字符串内容时,您可能最终会比较指针......需要重新考虑设计。
  • 我使用它是因为我不打算比较字符串的内容。我知道这一点。我创建了一个最小的完整示例来执行,但无法重现它..
  • 所以你想比较地址?
  • @manni66 完全正确

标签: c++ dictionary stl unordered-map


【解决方案1】:

BufferContainer 为其映射使用全局变量,与特定的BufferContainer 实例无关。一个测试插入的条目在另一个测试中可见。那个全局地图塞满了悬空指针。

碰巧NotContainsBuffer 测试中的name2 与先前测试插入到映射中的字符串位于相同的堆栈位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 2017-04-28
    • 2018-03-25
    • 1970-01-01
    • 2016-09-28
    • 2021-03-10
    • 1970-01-01
    相关资源
    最近更新 更多