gpt4 book ai didi

c++ - 在 Windows 中,如何将 `GlobalAlloc` 替换为 `new` ?

转载 作者:可可西里 更新时间:2023-11-01 11:21:14 28 4
gpt4 key购买 nike

在 Windows 中,如何将 GlobalAlloc 替换为 new

您好,我有这段代码(来自这里:"Reading from a Mailslot")使用 GlobalAlloc 分配内存。

DWORD cbRead = 0;
LPTSTR lpszBuffer = (LPTSTR) ::GlobalAlloc(GPTR, cbMessage); //cbMessage is from a call to GetMailslotInfo
if( NULL == lpszBuffer )
return FALSE;
lpszBuffer[0] = '\0';
BOOL fResult = ::ReadFile(hSlot, lpszBuffer, cbMessage, &cbRead, 0);
if (fResult)
{
_tprintf(TEXT("Contents of the mailslot: %s\n"), lpszBuffer);
}
::GlobalFree((HGLOBAL) lpszBuffer);

我想更改代码并使用智能指针而不是裸露的 LPTSTR(并摆脱 GlobalFree)和 new 而不是 GlobalAlloccbMessage 是“下一条消息的大小,以字节为单位”,所以我需要像 malloc 这样的东西,它适用于非类型化内存,是否有任何形式的 new 适合我的情况吗?

最佳答案

一般来说,你不能。

不同的内存分配函数(GlobalAllocmallocnewSysAllocVirtualAlloc, HeapAlloc) 的存在是因为它们以不同的方式、不同的位置、不同的大小、不同的标记、使用不同的底层管理器以及无数其他差异分配内存。其中一些在本地堆中,一些是全局的,一些是虚拟的,一些没有指定,其他分配内存并用它做事,例如 SysAllocString,其他与 COM 一起工作的 CoGetMalloc,等等。

如果调用指定使用一个分配器,则可能存在将内存传递给另一个进程的底层代码或需要该分配器的某些其他行为。您可以尝试使用不同的,但它很可能是未定义的行为。

为了在其他分配器中使用智能指针,您可以做一些事情。最简单的方法是将它们作为分配器和释放器函数提供给智能指针类,使其能够正确处理事情。根据您选择的指针,这可能需要进行一些调整,或者您可能必须组合一个能够与该分配器一起使用的基本智能指针。

对于常见的分配器,MFC 和/或 ATL 通常具有与一个或多个专用分配器一起工作的智能指针和辅助函数。如果可以使用这些,您可以研究一下。

关于c++ - 在 Windows 中,如何将 `GlobalAlloc` 替换为 `new` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9233860/

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