Effective C++ .14 智能指针的拷贝与deleter函数

#include <iostream>
#include <cstdlib>
#include <memory>
using namespace std;

class Kiwi {
private:
    int weight;
public:
    Kiwi(int w) : weight(w) {}
    ~Kiwi() {
        cout<<"~Kiwi"<<endl;
    }
    int getWeight() {return weight;}
};

void deleter(Kiwi* x) {
    cout<<"deleting"<<endl;
    // if remove below line object will not be delete by smart pointer
    delete x;
}

void driven() {
    shared_ptr<Kiwi> p(new Kiwi(100), deleter);
    cout<<p->getWeight()<<endl;
    cout<<p.use_count()<<endl;

    shared_ptr<Kiwi> q = p;
    cout<<p->getWeight()<<endl;
    cout<<q->getWeight()<<endl;
    cout<<p.use_count()<<endl;
    cout<<q.use_count()<<endl;
}

int main() {
    cout<<"test start"<<endl;
    driven();
    cout<<"test end"<<endl;
    return 0;
}

智能可以定义deleter函数,即在其认为资源应该释放时调用该函数来代替默认的delete操作

时间: 2024-10-08 16:38:05

Effective C++ .14 智能指针的拷贝与deleter函数的相关文章

引用计数的智能指针的实现

引用计数的智能指针是对<Effective C++ 条款13:以对象管理资源>的一个实现. 我们要设计一个智能指针,使他能够管理资源,在正确的实际调用资源的析构函数. 首先我们需要一个指针reference来指向资源,当智能指针构造时,用reference指针指向资源,在我们确定资源应该被析构时,我们对reference指针进行delete. 如果只有reference指针的话,只能实现出auto_ptr的效果,我们还需要添加引用计数系统counter来统计指向资源的智能指针的个数.count

智能指针学习笔记

1. 介绍 本文介绍智能指针的使用.智能指针是c++ 中管理资源的一种方式,用智能指针管理资源,不必担心资源泄露,将c++ 程序员 从指针和内存管理中解脱出来,再者,这也是c++发展的趋势(这话不是我说的,见<Effective c++>和<c++实践编程>),应该认真学习一下. 智能指针中,最有名的应该数auto_ptr,该智能指针已经被纳入标准库,只需要包含<memory>头文件即可以使用,另外,TR1文档定义的shared_ptr和weak_ptr也已经实现(我用

【C++】动态内存与智能指针

C++常见的内存分配方式有三种: 从静态存储区分配,这里主要是存储局部static对象,类的static成员以及定义在函数之外的变量: 从栈内存分配,这里主要是存储函数内的非static对象: 从堆内存动态分配 其中,静态存储区以及栈内存中的对象,都是由编译器自动创建和销毁,而堆内存中的对象都是由程序显示控制的,通常都是new创建delete销毁或者malloc创建free销毁.动态内存的管理非常棘手,如果动态地创建了对象却没有显式得销毁,就会发生内存泄漏:如果在还有指针引用的时候释放了内存就会

STL模板_智能指针概念

一.智能指针1.类类型对象,在其内部封装了一个普通指针.当智能指针对象因离开作用域而被析构时,其析构函数被执行,通过其内部封装的普通指针,销毁该指针的目标对象,避免内存泄露.2.为了表现出和普通指针一致的外观和行为,重载了解引用运算符(*)和间接成员访问运算符(->)函数,令其使用者可以将一个智能指针当成普通指针一样地使用.3.智能指针没有拷贝语义,只有转移语义,任何时候都只有一个智能指针对象持有真正的对象地址.4.智能指针不支持对象数组.二.模板的非类型参数1.无论是函数模板还是类模板,其模板

boost之智能指针

最近在看一本书<boost程序库完全开发指南>,boost是一个强大的C++程序库,丰富了C++的功能和表现力,使得C++软件开发更加简洁.优雅.灵活和高效.因为之前使用Qt做了很多项目,我发现boost和Qt有很多相似之处,比如时间.智能指针.字符串处理.函数信号槽等,在Qt中最好还是用Qt中封装好的东西来做.下面归纳最近所学习的boost只能指针知识. 一.为何要使用智能指针 C++程序员通常使用RAII机制(资源获取即初始化)来管理内存资源,在构造函数中申请资源,析构函数中释放资源.局部

“智能指针”的成长

智能指针是什么,他的真面目就是一个类生成的对象,这个类中包含了基本的重载->.*等一些指针形态的用法,最主要的是这个类里面有一个指针参数:所有智能指针类中都有一个explicit构造函数,以指针作为参数.比如auto_ptr的类模板原型为: template<class T> class auto_ptr{ explicit auto_ptr(T* p = 0); }; 代码中构造函数用了explicit关键字主要是防止隐式转换,举个例子: auto_ptr<double>

Chromium和WebKit的智能指针实现原理分析

C++不像Java一样,由虚拟机负责对象分配和释放.也就是说,开发人员使用C++编写代码时,要自己负责对象分配和释放.WebKit和Chromium都是使用C++开发的,因此它们也面临上述问题.在解决对象释放问题时,要做到在对象不需要时自动释放,因为手动释放会带来忘记释放或者释放后又继续使用的隐患.智能指针是实现对象自动释放的有效技术手段.本文就分析Chromium和WebKit的智能指针的实现. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 在现实中,

【C++】智能指针详解(四):shared_ptr

在开始本文内容之前,我们再来总结一下,前文内容: 1.智能指针采用RAII机制,在构造对象时进行资源的初始化,析构对象时进行资源的清理及汕尾. 2.auto_ptr防止拷贝后析构释放同一块内存,采用"转移所有权"的方法.(实际开发中auto_ptr并不实用) 3.scoped_ptr与auto_ptr类似,但是它与auto_ptr最大的区别是:它不能转移所有权,即就是禁止拷贝/赋值!(当然,我们也探讨了C++中禁止拷贝对象的技术,在此不赘述) 回顾完前文内容后,我们今天来讨论share

Cocos2d-x 3.2 智能指针

Cocos2d-x 3.2:智能指针 本文转载自深入理解Cocos2d-x 3.x:内置数据结构(1)智能指针 智能指针在 C++ 11 的标准中已经存在了,分别是unique_ptr,shared_ptr,weak_ptr,其中最常用的应该是share_ptr,它采用引用计数的方 式管理内存,当引用计数为0的时候,自动释放内存,但是由于shared_ptr考虑到了线程安全,所以会存在有较大的性能损失.所以在实时游戏开发中, 往往不会用到shared_ptr. 在Cocos2d-x 3.2以及更