C++模板学习之智能指针类模板
- 作者: 来碗蛋炒饭不加蛋
- 来源: 51数据库
- 2021-06-29
智能指针的意义 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;
}
推荐阅读
