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

如何正确使用智能指针操作CMFCPropertyGridProperty以避免使用new?

如何结合智能指针使用CMFCPropertyGridProperty避免手动new?

CMFCPropertyGridCtrl的AddProperty方法会接管传入的CMFCPropertyGridProperty对象的所有权,控件销毁时会自动清理这些属性。我们可以利用std::unique_ptr替代手动new,同时正确转移所有权给控件,具体修改如下:

修改后的代码

#include <memory>

auto AddSection = [](CMFCPropertyGridCtrl* pGrid, const CString& strSection) -> CMFCPropertyGridProperty*
{
    // 使用std::make_unique创建智能指针,替代手动new
    auto pSection = std::make_unique<CMFCPropertyGridProperty>(strSection);
    // 释放智能指针的所有权,将原始指针交给属性网格控件管理
    CMFCPropertyGridProperty* pRawPtr = pSection.release();
    pGrid->AddProperty(pRawPtr);

    return pRawPtr;
};

关键说明

  • 用std::make_unique替代new:这是C++14及以上推荐的安全创建动态对象的方式,能避免new可能带来的内存泄漏问题,同时自动推导模板参数。
  • 调用release()转移所有权:std::unique_ptr的release()方法会放弃对原始指针的所有权,返回裸指针。因为AddProperty会负责后续销毁属性对象,必须让智能指针释放所有权,否则会出现双重释放的问题。
  • 返回裸指针的必要性:如果调用方需要对该属性进行后续操作(比如添加子属性、修改属性值),可以直接使用返回的裸指针,但此时对象的所有权已经属于属性网格控件,调用方无需手动销毁。

注意事项

  • 不要使用std::shared_ptr:属性网格控件对属性对象是独占所有权的,共享所有权会导致控件销毁时对象仍被智能指针持有,或者智能指针提前释放对象导致控件访问野指针。
  • 确保包含<memory>头文件:智能指针的定义在该头文件中,必须提前引入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 08:33:33