gpt4 book ai didi

c++ - WM_DROPFILES 之后 free() 上的堆损坏

转载 作者:行者123 更新时间:2023-11-30 21:18:20 25 4
gpt4 key购买 nike

我必须分配一些内存来为此消息上的 WPARAM 创建一个奇怪的结构,但是在调用 PostMessage 后,我无法释放内存,除非程序崩溃,并提示存在堆损坏。

void DropFileMsg(HWND hWind,char* file_path)
{
DROPFILES* drop_data = (DROPFILES*)malloc(2048);
char* files = (char*)drop_data+sizeof(DROPFILES);
ZeroMemory(drop_data,2048);

drop_data->pFiles = sizeof(DROPFILES);
drop_data->pt.x=0;
drop_data->pt.y=0;
drop_data->fNC=false;
drop_data->fWide=false;

strcpy(files,file_path);
PostMessage(hWind, WM_DROPFILES, (WPARAM)drop_data, NULL);
free(drop_data);
}

堆损坏错误:指定给 RtlGetUserInfoHeap(002F0000, 00300018) 的地址无效

如果没有free,也没有PostMessage,这完全可以正常工作,但两者都不能。这是为什么?

这与它被过早释放无关,如最佳答案中所建议的,停止投票。如果是这种情况,这个问题就不是关于堆损坏的问题,而是会导致访问冲突。

最佳答案

这可能是因为 WM_DROPFILES 消息的接收者使用了该指针,但您已经取消分配它,因此指针现在指向未分配的内存,并且您有 undefined behavior .

与其释放内存,为什么不让接收者在完成后释放内存?

关于c++ - WM_DROPFILES 之后 free() 上的堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25519847/

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