使用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
相关产品推荐
相关产品推荐

