c++ - C++:在unordered_map <UINT_PTR,Object *>中查找修改的UINT_PTR

我正在使用Windows中的API,该API本质上使用UINT_PTR(对象的地址)进行回调,并提供了获取有关这些对象的更多信息的方法。

我有一个集合,其中MyObject是我的类,其中包含我关心的信息(对该问题不重要):

std::unordered_map<UINT_PTR,MyObject*> objectMap;

我有一个将被多次调用的函数。在某些情况下,需要修改API提供的地址。我在收藏中找不到任何修改过的UINT_PTR。例如:
void CallbackHandler::APICallback( UINT_PTR address )
{
    UINT_PTR collectionKey = address;

    if( SomeCondition() )
    {
        collectionKey -= 0x10;
    }

    if( objectMap.count( collectionKey ) == 1 )
    {
      // Write message to log, condition we care about occurred
    }
    else
    {
      // Do some info gathering and evaluation, possibly adding collectionKey to objectMap
    }
}

因此,例如,第一次将上述函数称为“0xFF4116A8”添加到集合中。第二次调用该函数时,address =“0xFF4116B8”和SomeCondition()恰好为真,因此我们减去0x10即可再次获得“0xFF4116A8”。但是,objectMap.count(“0xFF4116A8”)== 1是不正确的……但是当我记录集合“0xFF4116A8”的内容时,确实存在。

我怀疑我在尝试对UINT_PTR进行算术运算时犯了某种根本性的错误,或者对unordered_map的行为做出了一些错误的假设。我在这里犯了什么错误?修改UINT_PTR然后在集合中查找它的正确方法是什么?

最佳答案

我不能以此来谴责你的例子:

#include <unordered_map>

struct MyObject{};

int main(int argc, _TCHAR* argv[])
{
    std::unordered_map<UINT_PTR,MyObject*> objectMap;
    UINT_PTR x = 0xFF4116A8;
    objectMap[x] = nullptr;
    UINT_PTR y = 0xFF4116B8;
    y -= 0x10;
    auto c = objectMap.count(y);    // c == 1
    return 0;
}

您在64位计算机上吗?您是否有可能在未提供的代码中进行符号扩展的指针算术运算?