You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用GetProfileBinary时能否使用std::make_unique管理返回的内存

结论

你对场景的判断完全正确,当前场景不应该使用std::make_unique。

原因说明

  • std::make_unique的核心作用是自行在堆上分配新对象、同时完成std::unique_ptr的所有权封装,仅适用于你主动通过new创建对象的场景。
  • 你当前持有的DATE*指针是GetProfileBinary接口内部完成分配后返回的,属于「接管其他来源的原始指针」的场景,完全符合你之前了解到的make_unique不适用的情况。

优化建议

虽然不需要用std::make_unique,但你仍然可以使用std::unique_ptr来管理指针生命周期,避免手动delete[]可能出现的资源泄漏风险(比如后续新增分支提前return、或者中间逻辑抛出异常导致释放代码未执行),只需要为unique_ptr指定数组删除器即可。
修改后的代码参考:

void CAutomaticBackupSettingsPage::GetLastBackupDate(COleDateTime& rBackupDate)
{
    DATE* pDatTime = nullptr;
    UINT uSize;

    theApp.GetProfileBinary(_T("Options"), _T("BackupLastBackupDate"), pointer_cast<LPBYTE*>(&pDatTime), &uSize);
    // 用unique_ptr接管指针,函数退出时自动调用delete[]释放
    std::unique_ptr<DATE[]> autoRelease(pDatTime);

    if (uSize == sizeof(DATE))
        rBackupDate = *pDatTime;
    else
        rBackupDate = COleDateTime::GetCurrentTime();

    // 无需手动释放资源
}

关于工具警告的说明

静态代码分析工具给出的只是通用场景建议:它识别到你在手动释放原始指针,所以默认推荐使用智能指针。但它没有判断指针的具体来源,所以建议中提到的「使用std::make_unique」的部分并不适配你的场景,你只需要按需用unique_ptr接管已有指针即可。


内容的提问来源于stack exchange,提问作者Andrew Truckle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:39:02