包含指针的容器delete方式

如何正确处理包含指针的容器是值得探究的。


一、常见的方式,直接手动delete

void doSomething()
{
        vector<Widget*> vwp;
        for (int i = 0; i < SOME_MAGIC_NUMBER; ++i)
                vwp.push_back(new Widget);
        ...         

    for (vector<Widget*>::iterator i = vwp.begin();i != vwp.end(),++i) { 
                delete *i;
        }
                         

}    


二、使用 函数对象+模板的技巧

struct DeleteObject {                           // 删除这里的
                                                // 模板化和基类
        template<typename T>                     // 模板化加在这里
        void operator()(const T* ptr) const { 
                delete ptr; 
        } 
}


void doSomething()
{
        deque<SpecialString*> dssp;
        ...
        for_each(dssp.begin(), dssp.end(),DeleteObject());  // 啊!良好定义的行为!
} //但不是异常安全的


三、  利用Boost的shared_ptr   

 void doSomething()
{
        typedef boost::shared_ ptr<Widget> SPW; //SPW = "shared_ptr to Widget"
        vector<SPW> vwp;
        for (int i = 0; i < SOME_MAGIC_NUMBER; ++i)
                vwp.push_back(SPW(new Widget)); // 从一个Widget建立SPW,
                                                // 然后进行一次push_back
                ...                     // 使用vwp
}                                       // 这里没有Widget泄漏,甚至
                                        // 在上面代码中抛出异常                       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值