c++ - 将 std::make_unique 与 GetProfileBinary 函数调用一起使用
问题描述
我已经看到了这个答案(使用 std::make_unique 优于 new 运算符的优点),其中指出:
make_unique
如果您需要自定义删除器或从其他地方采用原始指针,请不要使用。
这是我的代码:
void CAutomaticBackupSettingsPage::GetLastBackupDate(COleDateTime& rBackupDate)
{
DATE* pDatTime = nullptr;
UINT uSize;
theApp.GetProfileBinary(_T("Options"), _T("BackupLastBackupDate"), pointer_cast<LPBYTE*>(&pDatTime), &uSize);
if (uSize == sizeof(DATE))
rBackupDate = *pDatTime;
else
rBackupDate = COleDateTime::GetCurrentTime();
delete[] pDatTime;
pDatTime = nullptr;
}
代码分析给了我两个警告:
和
后一个警告建议我使用std::make_unique
,但是由于我的指针数据是从GetProfileBinary
调用中返回的,并且给出了相关问题中的陈述,这是否意味着我不应该使用std::make_unique
?我承认这是我以前没有做过的事情。
使用GetProfileBinary
明确指出:
GetProfileBinary
分配一个缓冲区并返回它的地址*ppData
。调用者负责使用释放缓冲区delete[]
。
解决方案
pDateTime
应该是nullptr
,并GetProfileBinary
处理分配。代码分析错误地认为你忘记了分配。
它确实需要在调用之前检查是否成功delete[]
。我们不能使用delete[]pDatTime
,因为pDatTime
不是数组。但是GetProfileBinary
分配 using new BYTE[size]
,所以我们需要转换回BYTE
.
您还可以NULL
在阅读之前添加检查pDatTime
,这可能会使代码分析感到高兴。
if (pDatTime && uSize == sizeof(DATE))
rBackupDate = *pDatTime;
else
rBackupDate = COleDateTime::GetCurrentTime();
if(pDatTime) delete[](BYTE*)pDatTime;
您可以std::unique_ptr<BYTE[]> cleanup((BYTE*)pDatTime)
用于删除,但这必须在GetProfileBinary
调用之后。
例子:
DATE* pDatTime = nullptr;
GetProfileBinary(_T("Options"), _T("BackupLastBackupDate"), (LPBYTE*)(&pDatTime), &uSize);
std::unique_ptr<BYTE[]> cleanup((BYTE*)pDatTime); //automatic delete
if (pDatTime && uSize == sizeof(DATE))
rBackupDate = *pDatTime;
else
rBackupDate = COleDateTime::GetCurrentTime();
//pDatTime = NULL; <- Error when used with unique_ptr
...
//pDatTime is deleted later, when `cleanup` goes out of scope
推荐阅读
- reactjs - 合并材质 UI 主题
- java - Eclipse 中的 Java 项目。使用“ctrl+click”或“F3”打开声明或实现的功能不起作用
- javascript - propsecureTextEntry 导致 TextInput 和 Keyboard iOS 有一个奇怪的行为
- python - Python Scraping 提取船只名称
- python-3.x - 使用 BSoup 解析来自 Python 请求的注释数据
- python - Python:根据给定的单词选择句子并将其导出为 excel
- php - 使用 Laravel Sail 运行 Laravel Dusk 时连接被拒绝
- linux - 如何在远程机器上运行复杂的 awk 命令
- docker - VSCode ACI 部署的 Docker 容器未显示在侧边栏中
- salt-stack - Salt stack:如何使用 Chocolate(状态)设置包安装检查