您的位置:首页 > 其它

包含指针的容器delete方式

2016-12-12 15:08 176 查看
如何正确处理包含指针的容器是值得探究的。

一、常见的方式,直接手动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泄漏,甚至

                                        // 在上面代码中抛出异常                       
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: