欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++模板学习之智能指针类模板

程序员文章站 2022-10-27 15:24:30
智能指针的意义 stl中的指针指针 auto_ptr shared_ptr weak_ptr unique_ptr qt中的智能指针 qpointer qsharedpointer qweakpoi...

智能指针的意义 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;
}