[英]Need a better understanding of smart pointers with windows API
我很难理解智能指针(仍处于学习tbh的开始阶段)。 也许我一直在关注这个问题太久了,而我却错过了这个简单的概念...
我正在将所有“新/删除”都转换为智能指针,因此内存泄漏/损坏没有太大的问题。
使用unique_ptr,您不仅可以:
PCHAR test;
std::unique_ptr<char[]> buffer = std::make_unique<char[]>(10);
buffer.get() = test;
(如果我错了,请纠正我)所以,我传递了一个raw_shared_ptr来获取需要查看PE标头的字节地址。 pFileBase的字节将为“ MZ”,但我的shared_ptr没有返回这些字节。 我想念什么?
有没有一种方法可以使WinAPI函数返回到智能指针? 我也知道我的shared_ptr不是char [],所以这是修复的下一步。
BOOL InitializeFromDisk(std::wstring &wsTempPath, char *pFileBase)
{
...
pFileBase = (PCHAR)MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
if (pFileBase == 0) return FALSE;
return TRUE;
}
int main()
{
std::shared_ptr<char> pFile = std::make_shared<char>(0);
InitializeFromDisk(L"c:\\...", pFile.get());
...
PIMAGE_DOS_SIGNATURE pDosHdr;
std::copy(pFile, 2, pDosHdr); //I'm sure this line doesn't quit work yet
}
我可能会做这样的事情。 智能指针具有移动构造函数,因此返回它们非常有效,这样做还可以产生更好的代码。 请注意在shared_ptr构造函数中使用deleter参数。
std::shared_ptr<VOID> InitializeFromDisk(const std::wstring& wsTempPath, char *pFileBase)
{
...
auto pMappedFile = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
if (pMappedFile == nullptr)
{
auto lastError = GetLastError();
throw system_error(lastError, system_category());
}
return shared_ptr<VOID>(pMappedFile, [](auto p) { UnmapViewOfFile(p); });
}
在win32中 ,大多数API都不将对象作为普通内存返回。 相反,它们通常返回HANDLE
或从IUnknown
派生的对象实例。 要释放与HANDLE
相关联的内存,通常将调用CloseHandle
。 要释放与IUnknown
对象关联的内存,请调用->Release()
。 一些分配需要特殊的发布调用。 在您的示例中,必须将MapViewOfFile
返回的指针与UnmapViewOfFile
释放。
对于Win32对象的更常见类型,智能指针包装器在Microsoft::WRL
库中实现。 例如:
Microsoft::WRL::ComPtr<ID3D12Device> spDevice;
D3D12CreateDevice(..., IID_PPV_ARGS(&spDevice));
Microsoft::WRL::Wrappers::FileHandle shFile;
shFile = CreateFile2(...);
超出范围时,将适当地重新分配spDevice
和shFile
。
对于其他分配,例如返回的MapViewOfFile
指针,则必须创建自己的智能指针/句柄类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.