如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉

本文探讨了在C++中如何有效地管理和释放通过new分配的内存。通过使用自定义伪函数DeleteObject配合标准库函数for_each,实现了对容器内指针的安全删除。此外,还介绍了如何利用智能指针如boost::shared_ptr来确保资源的安全释放,从而避免内存泄漏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当容器中包含的是通过new的方式分配的指针时,指针容器在自己被析构时会析构所包含的所有元素,但指针的“析构函数”不做任何事情!它当然也不会调用delete

1.可用于for_each的伪函数

template<typename T>
struct DeleteObject :                           // 条款40描述了为什么
        public unary_function<const T*, void> { // 这里有这个继承
        void operator()(const T* ptr) const
        {
                delete ptr;
        }
};

 for_each(vwp.begin(), vwp.end(), DeleteObject<Widget>);

2.从没有析构函数的类公有继承是c++大忌 

3.你可以通过编译器推断传给DeleteObject::operator()的指针的类型来消除这个错误(也减少DeleteObject的用户
需要的击键次数)。我们需要做的所有的事就是把模板化从DeleteObject移到它的operator():

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

编译器知道传给DeleteObject::operator()的指针的类型,所以我们可以让它通过指针的类型自动实例化一个
operator()。这种类型演绎下降让我们放弃使DeleteObject可适配的能力(参见条款40)。

for_each(dssp.begin(), dssp.end(),DeleteObject ());

4.对于第3中方式

直截了当而且类型安全,正如我们喜欢的一样。
但仍不是异常安全的。如果在SpecialString被new但在调用for_each之前抛出一个异常,就会发生泄漏。
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、付费专栏及课程。

余额充值