首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么把HeapFree和Detours连在一起而不为delete/免费工作?

为什么把HeapFree和Detours连在一起而不为delete/免费工作?
EN

Stack Overflow用户
提问于 2020-01-03 13:44:39
回答 1查看 449关注 0票数 0

我正试图为我的Windows应用程序编写一个内存跟踪器。我已经完成了一个使用Detours的原型。我连接了HeapAlloc、HeapReAlloc、HeapFree、HeapDestroy,并输出了一些日志供我查看。不过,出了点问题。

下面是我的示例代码:

代码语言:javascript
复制
void thread_foo()
{
    while(1)
    {
        void* tempPtr = HeapAlloc(GetProcessHeap(), 0, 3);
        Sleep(50);
    }
}

int main()
{
    std::thread tobj(thread_foo);
    int size = 16;
    tobj.join();
}

下面是我的跟踪输出(前32行,格式为ALLOC/FREE/REALLOC/ result :时间戳、调用堆栈哈希、堆指针、标志、大小、结果指针):

代码语言:javascript
复制
ALLOC:2736795824738, -592122872, 0000019110690000, 0, 256, 000001911069E130
ALLOC:2736795825084, 1232708493, 0000019110690000, 0, 16, 000001911069F0A0
ALLOC:2736795825225, -929256262, 0000019110690000, 0, 56, 000001911069FAF0
ALLOC:2736795825284, -929523462, 0000019110690000, 0, 2, 000001911069FBF0
ALLOC:2736795825323, 151458640, 0000019110690000, 0, 2, 000001911069FBF0
ALLOC:2736795825369, -929340699, 0000019110690000, 0, 16, 000001911069F200
ALLOC:2736795825404, 1203567881, 0000019110690000, 0, 48, 000001911069F570
ALLOC:2736795825436, 1789431341, 0000019110690000, 8, 344, 000001911069FC10
ALLOC:2736795825511, -1394565794, 0000019110690000, 0, 1702, 000001911069FD70
ALLOC:2736795825573, 955998638, 0000019110690000, 0, 6, 000001911069E240
ALLOC:2736795825600, -958719147, 0000019110690000, 0, 2, 000001911069E260
ALLOC:2736795825625, 955994058, 0000019110690000, 8, 4, 000001911069E280
ALLOC:2736795825651, 1789431550, 0000019110690000, 8, 344, 000001911069E2A0
ALLOC:2736795825677, -1394565585, 0000019110690000, 0, 1702, 000001911069FD70
ALLOC:2736795825714, 955998680, 0000019110690000, 0, 6, 000001911069E280
ALLOC:2736795825736, 122263169, 0000019110690000, 0, 2, 000001911069E240
ALLOC:2736795825761, 1203256005, 0000019110690000, 8, 512, 000001911069E400
ALLOC:2736795825786, 955996289, 0000019110690000, 8, 4, 000001911069E610
ALLOC:2736795825810, 1789433781, 0000019110690000, 8, 344, 000001911069FC10
ALLOC:2736795825834, -1394563354, 0000019110690000, 0, 1702, 000001911069FD70
ALLOC:2736795825868, 956000911, 0000019110690000, 0, 6, 000001911069E610
ALLOC:2736795825893, 1203615483, 0000019110690000, 0, 16, 000001911069F140
ALLOC:2736795825921, 1232708730, 0000019110690000, 0, 16, 000001911069F160
ALLOC:2736795825945, -929316070, 0000019110690000, 0, 16, 000001911069F260
ALLOC:2736795825968, 1232708941, 0000019110690000, 0, 16, 000001911069F1A0
ALLOC:2736795825990, -929340251, 0000019110690000, 0, 16, 000001911069F2A0
ALLOC:2736795826013, 1232709165, 0000019110690000, 0, 16, 000001911069F0C0
ALLOC:2736795826033, -929340027, 0000019110690000, 0, 16, 000001911069F100
ALLOC:2736795826066, 151797360, 0000019110690000, 0, 16, 000001911069F120
ALLOC:2736795826106, -929229531, 0000019110690000, 0, 16, 000001911069F2C0
ALLOC:2736795826131, 1203787877, 0000019110690000, 0, 96, 000001911069E240
ALLOC:2736795826158, 1789651341, 0000019110690000, 8, 344, 000001911069FD70

问题是第4行和第5行,正如我们所看到的,得到相同的指针。他们之间没有HeapFree或HeapDestroy。这两个HeapAllocs不是我的电话,我可以根据大小来决定它。我猜想它们与std::线程有关。他们并不是唯一的一对。第9、14、20、32行也是一样的。

如果删除与线程相关的代码,只需在thread_foo()中调用main(),那么一切看起来都很好。

有人对此有什么想法吗?

P.S.如果有人关心挂钩代码,它只是基于https://github.com/microsoft/Detours/blob/master/samples/tracemem/trcmem.cpp

我添加了挂钩HeapReAlloc、HeapFree、HeapDestroy和收集日志到文件中。

都安全了!安全!

我找到了原因。原因是,虽然我钩住了 HeapFree ,但是deletefree()释放的所有内存都没有调用包装好的HeapFree。我不知道为什么,但这就是事实。现在我也钩上了CRT (),隐藏起来的免费消息就出来了。

因此,我改变了这个问题的标题。希望有人对此有任何线索。

EN

回答 1

Stack Overflow用户

发布于 2020-01-07 12:50:17

几乎每个现代C++实现都会在内部回收少量的分配,而不涉及操作系统。涉及操作系统需要一定的时间开销,而节省的几个字节并不能证明这一点是正确的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59579670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档