在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形式?

最佳答案

通常,您不能。

存在不同的内存分配功能(GlobalAllocmallocnewSysAllocVirtualAllocHeapAlloc),因为它们以不同的方式,不同的位置,不同的大小,不同的标记,使用不同的底层管理器以及无数其他差异来分配内存。其中一些位于本地堆中,一些位于全局堆中,一些是虚拟的,有些未指定,其他一些分配内存并使用内存进行处理,例如SysAllocString,其他使用CoGetMalloc等COM进行工作,等等。

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

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

对于常见的对象,MFC和/或ATL通常具有与一个或多个专用分配器一起使用的智能指针和辅助函数。如果可以使用这些功能,则可以进行调查。

10-05 19:04