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

使用std::unique_ptr替代delete释放指针时报错如何解决

报错原因

你代码中std::unique_ptr的模板参数填写错误:

  • std::unique_ptr<T>的模板参数T是指针指向的元素类型,你传入的pWidth是WORD*类型,指向单个WORD对象,所以模板参数应该填WORD
  • 你写的std::unique_ptr<WORD*>代表创建一个持有WORD**二级指针的智能指针,和你传入的WORD*类型不匹配,所以触发编译报错
正确实现

只需要修改DeleteColumnWidthMap中智能指针的声明即可:

void CCreateReportDlg::DeleteColumnWidthMap(CMapWordToPtr& rMapColumnWidth)
{
    WORD        wColumn{}, * pWidth = nullptr;

    auto sPos = rMapColumnWidth.GetStartPosition();
    while (sPos != nullptr)
    {
        rMapColumnWidth.GetNextAssoc(sPos, wColumn, reinterpret_cast<void*&>(pWidth));
        if (pWidth != nullptr)
        {
            // 模板参数填WORD,传入pWidth即可,出作用域自动释放内存
            std::unique_ptr<WORD> cleanup(pWidth);
        }
    }
    rMapColumnWidth.RemoveAll();
}
补充说明

你在HideColumns中使用std::make_unique<WORD>().release()交出所有权的逻辑是正确的,不需要修改,因为CMapWordToPtr只能存储void*类型的裸指针,必须先释放智能指针的所有权才能把裸指针存入映射表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:06:03