繁体   English   中英

需要对Windows API的智能指针有更好的了解

[英]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); });
}

,大多数API都不将对象作为普通内存返回。 相反,它们通常返回HANDLE或从IUnknown派生的对象实例。 要释放与HANDLE相关联的内存,通常将调用CloseHandle 要释放与IUnknown对象关联的内存,请调用->Release() 一些分配需要特殊的发布调用。 在您的示例中,必须将MapViewOfFile返回的指针与UnmapViewOfFile释放。

对于对象的更常见类型,智能指针包装器在Microsoft::WRL库中实现。 例如:

Microsoft::WRL::ComPtr<ID3D12Device> spDevice;
D3D12CreateDevice(..., IID_PPV_ARGS(&spDevice));

Microsoft::WRL::Wrappers::FileHandle shFile;
shFile = CreateFile2(...);

超出范围时,将适当地重新分配spDeviceshFile

对于其他分配,例如返回的MapViewOfFile指针,则必须创建自己的智能指针/句柄类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM