如何正确使用智能指针操作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
相关产品推荐
相关产品推荐

