尝试用 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 函数时。
我再次对唯一指针和删除感到困惑。
我试图避免需要下面的 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 函数时。