C++模板学习之智能指针类模板
智能指针的意义 stl中的指针指针 auto_ptr shared_ptr weak_ptr unique_ptr qt中的智能指针 qpointer qsharedpointer qweakpointer qscopedarraypoint qshareddatapointer qexplicitilyshareddatapointer
智能指针的意义
现代c++开发库中最重要的类模板之一 c++中自动内存管理的主要手段 能够在很大程度上避开内存相关的问题
因为智能指针使用类的形式封装成一个指针类。所以在不同平台上可能有不同的实现方式。所以了解不同平台中智能指针的实现,对我们来说很有帮助。
stl中的指针指针
auto_ptr
生命周期结束时,销毁指向的内存空间 不能指向堆数组,只能指向堆对象(变量) 一片堆空间只属于一个指针指针对象 多个智能指针对象不能指向同一片堆空间
shared_ptr
带有引用计数机制,支持多个指针对象指向同一片内存
weak_ptr
配合shared_ptrer 而引入的一种智能指针
unique_ptr
一个智能指针对象指向一片内存空间,不能拷贝构造和赋值
示例代码:auto_ptr使用初探
#include #include #include using namespace std; class test { string m_name; public: test(const char* name) { cout << "hello, " << name << "." << endl; m_name = name; } void print() { cout << "i'm " << m_name << "." << endl; } ~test() { cout << "goodbye, " << m_name << "." << endl; } }; int main() { auto_ptr pt(new test("d.t.software")); cout << "pt = " << pt.get() << endl; pt->print(); cout << endl; auto_ptr pt1(pt); cout << "pt = " << pt.get() << endl; cout << "pt1 = " << pt1.get() << endl; pt1->print(); return 0; }
输出结果:
hello, d.t.software.
pt = 0x9df9008
i’m d.t.software.
pt = 0
pt1 = 0x9df9008
i’m d.t.software.
goodbye, d.t.software.
qt中的智能指针
qpointer
当其指向对象被销毁时,它会被自动置空 析构时不会自动销毁所指向对象
qsharedpointer
引用计数型智能指针 可以被*拷贝和赋值 当引用计数为0时才删除指向的对象
qweakpointer
qscopedarraypoint
qshareddatapointer
qexplicitilyshareddatapointer
示例代码:qt中的智能指针
#include #include #include class test : public qobject { qstring m_name; public: test(const char* name) { qdebug() << "hello, " << name << "."; m_name = name; } void print() { qdebug() << "i'm " << m_name << "."; } ~test() { qdebug() << "goodbye, " << m_name << "."; } }; int main() { qpointer pt(new test("d.t.software")); qpointer pt1(pt); qpointer pt2(pt); pt->print(); pt1->print(); pt2->print(); delete pt; qdebug() << "pt = " << pt; qdebug() << "pt1 = " << pt; qdebug() << "pt2 = " << pt; qdebug() << endl; qsharedpointer spt(new test("delphi tang")); qsharedpointer spt1(spt); qsharedpointer spt2(spt); spt->print(); spt1->print(); spt2->print(); return 0; }
上一篇: mysql常用操作语法之存储过程相关讲解
下一篇: 理解Python闭包概念