在Windows中,如何用`new`替换`GlobalAlloc`?

时间:2012-02-10 19:46:09

标签: c++ windows memory new-operator smart-pointers

在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形式适合我的情况吗?< / p>

2 个答案:

答案 0 :(得分:3)

一般情况下,你不能。

存在不同的内存分配函数(GlobalAllocmallocnewSysAllocVirtualAllocHeapAlloc)因为它们分配内存以不同的方式,不同的地方,不同的规模,不同的标签,使用不同的底层经理,以及无数的其他差异。其中一些是在本地堆中,一些是全局的,一些是虚拟的,一些是未指定的,另一些是使用它来分配内存并执行操作,例如SysAllocString,其他与CoGetMalloc一样使用COM等等。

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

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

对于常见的,MFC和/或ATL通常具有与一个或多个专用分配器一起使用的智能指针和辅助函数。如果可以使用它们,你可以考虑一下。

答案 1 :(得分:1)

boost::scoped_array<TCHAR> buffer(new TCHAR[cbMessage / sizeof(TCHAR)]);
buffer[0] = 0;
BOOL fResult = ::ReadFile(hSlot, buffer.get(), cbMessage, &cbRead, 0);
if (fResult)
{
    _tprintf(TEXT("Contents of the mailslot: %s\n"), buffer.get());
}

这使用智能指针来管理内存,因此您无需明确释放它。 (提升scoped_array。)