gpt4 book ai didi

C++:在 unordered_map 中查找修改后的 UINT_PTR

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:57:22 25 4
gpt4 key购买 nike

我在 Windows 中使用一个 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 位计算机吗?您是否有可能在未提供的代码中进行符号扩展指针运算?

关于C++:在 unordered_map<UINT_PTR,Object*> 中查找修改后的 UINT_PTR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16419664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com