尝试用 std::unique_ptr 调用替换删除指针调用

Trying to replace delete pointer call with std::unique_ptr call

我再次对唯一指针和删除感到困惑。

我试图避免需要下面的 delete pWidth 行:

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)
        {
            //delete pWidth;
            std::unique_ptr<WORD*> cleanup(pWidth);
        }
    }
    rMapColumnWidth.RemoveAll();
}

为什么这么说?


啊,我想我现在看到 unique_ptr 应该是一个 WORD 指针数组。但是我只有一个值。

更新

我如何填充地图的示例(函数参数):

void CCreateReportDlg::HideColumns(CGridCtrl* pGrid, const CDWordArray* pAryDWColumns, CMapWordToPtr& rMapColumnWidth)
{
    ASSERT(pGrid != nullptr);
    ASSERT(pAryDWColumns != nullptr);

    if (pGrid == nullptr || pAryDWColumns == nullptr)
        return;

    DeleteColumnWidthMap(rMapColumnWidth);

    const auto iSize = pAryDWColumns->GetSize();
    for (INT_PTR i = 0; i < iSize; i++)
    {
        const auto dwColumnData = pAryDWColumns->GetAt(i);
        const auto iCol = LOWORD(dwColumnData);
        const auto eImage = static_cast<CheckImageIndex>(HIWORD(dwColumnData));

        if (eImage == CheckImageIndex::Unchecked)
        {
            auto pWidth = std::make_unique<WORD>().release();
            ASSERT(pWidth != nullptr);
            if (pWidth != nullptr)
            {
                *pWidth = pGrid->GetColumnWidth(iCol);
                rMapColumnWidth.SetAt(iCol, pWidth);
            }
            pGrid->SetColumnWidth(iCol, 0);
        }
    }
}

使用{std::unique_ptr<WORD> cleanup(pWidth);}删除pWidth = std::make_unique<WORD>().release();

但是std::map<int,int>(或unordered_map)比CMapWordToPtr好很多,你不需要在这里存储指针。

您应该能够像这样简化您的函数:

void HideColumns(CGridCtrl* pGrid, 
    std::vector<DWORD> &pAryDWColumns, std::map<int,int> &rMapColumnWidth)
{
    //clear the map, it doesn't need separate function
    rMapColumnWidth.clear();

    for (auto dword : pAryDWColumns)
    {
        const auto iCol = LOWORD(dword);
        const auto eImage = static_cast<CheckImageIndex>(HIWORD(dword));
        if (eImage == CheckImageIndex::Unchecked)
        {
            rMapColumnWidth[iCol] = pGrid->GetColumnWidth(iCol);
            pGrid->SetColumnWidth(iCol, 0);
        }
        pGrid->SetColumnWidth(iCol, 0);
    }
}

...
for (auto e : map)
    TRACE("%d\n", e);

顺便说一句,在另一个问题中,我认为我建议使用 std::unique_ptr 来关闭一些代码分析消息。你应该忽略那个建议。坚持使用 new/delete 或使用具有自动内存管理的 STL 类。

在某些特殊情况下您仍然可以使用 std::unique_ptr,例如将数据传递给 API 或某些 MFC 函数时。