需要使用Windows API更好地理解智能指针

时间:2017-07-25 19:14:37

标签: c++ c++11 winapi shared-ptr smart-pointers

我很难理解智能指针(仍处于学习tbh的开始阶段)。也许我已经把这个问题主演了太长时间而且我错过了这个简单的概念...

我正在处理所有我的"新/删除"进入智能指针所以我没有内存泄漏/腐败这么大的问题。

使用unique_ptr' s,你不能只是:

PCHAR test;
std::unique_ptr<char[]> buffer = std::make_unique<char[]>(10);
buffer.get() = test;

(如果我错了,请纠正我)相反,我传递一个原始的shared_ptr来获取我需要查看PE标头的字节地址。 pFileBase将具有字节&#34; MZ&#34;但我的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 
}

2 个答案:

答案 0 :(得分:2)

我可能会这样做。智能指针具有移动构造函数,因此返回它们非常有效,并且这样做也会产生更好的代码。请注意在shared_ptr构造函数中使用deleter参数。

Welcome to SWI-Prolog (threaded, 64 bits, version 7.3.35)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
Please run ?- license. for legal details.

For online help and background, visit http://www.swi-prolog.org
For built-in help, use ?- help(Topic). or ?- apropos(Word).


1 ?- Input.  
% ... 1,000,000 ............ 10,000,000 years later  
%   
%       >> 42 << (last release gives the question)
1 ?-   

答案 1 :(得分:0)

中,大多数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指针,您必须创建自己的智能指针/句柄类。