在Windows中,如何用new
替换GlobalAlloc
?
你好,我有一段代码(来自这里:"从邮箱阅读")其分配具有CCD_ 3的存储器。
DWORD cbRead = 0;
LPTSTR lpszBuffer = (LPTSTR) ::GlobalAlloc(GPTR, cbMessage); //cbMessage is from a call to GetMailslotInfo
if( NULL == lpszBuffer )
return FALSE;
lpszBuffer[0] = ' ';
BOOL fResult = ::ReadFile(hSlot, lpszBuffer, cbMessage, &cbRead, 0);
if (fResult)
{
_tprintf(TEXT("Contents of the mailslot: %sn"), lpszBuffer);
}
::GlobalFree((HGLOBAL) lpszBuffer);
我想更改代码,使用智能指针而不是空的LPTSTR
(并去掉GlobalFree
)和new
而不是GlobalAlloc
。cbMessage
是"下一条消息的大小,以字节为单位",所以我需要像malloc
这样的东西,它适用于非类型化内存,有什么形式的new
适合我的情况吗?
一般来说,你不能。
不同的内存分配函数(GlobalAlloc
、malloc
、new
、SysAlloc
、VirtualAlloc
、HeapAlloc
)之所以存在,是因为它们以不同的方式、不同的位置、不同的大小分配内存、不同的标记、使用不同的底层管理器以及无数其他差异。它们中的一些在本地堆中,一些是全局的,一些是虚拟的,一些没有指定,另一些分配内存并用它做事情,比如SysAllocString,另一些与COM一起工作,比如CoGetMalloc,等等
如果一个调用指定使用一个分配器,那么很可能有底层代码将内存传递给另一个进程或其他需要该分配器的行为。您可以尝试使用不同的行为,但它可能是未定义的行为。
为了将智能指针与其他分配器一起使用,您可以做一些事情。最简单的是将它们作为分配器和解除定位器函数提供给智能指针类,使其能够正确处理事情。根据您选择的指针,这可能需要一些调整,或者您可能必须组合一个能够与该分配器一起工作的基本智能指针。
对于常见的分配器,MFC和/或ATL通常具有与一个或多个专用分配器一起工作的智能指针和辅助函数。如果使用这些是可能的,你可以研究一下。
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: %sn"), buffer.get());
}
这使用智能指针来管理内存,因此不需要显式释放内存。(boost scoped_array。)