C++智能指针类模板

1、智能指针本质上是一个对象,这个对象可以像原生的一样来进行使用。原因是智能指针对象对应的类中,将指针相关的操作都进行了重载操作处理,所以才会达到这种像是原生的效果。

2、智能指针的意义:

现在C++开发库中最重要的类模板之一

C++中自动内存管理的主要手段

能够在很大程度上避开内存相关的问题

3、在QT中开发库中也提供了智能指针类模板,在STL标准库中也提供了,在c++的标准库忘了什么名了中也提供了智能指针类模板。所以智能指针类模板在C++中的地位很重要

4、STL中的智能指针类模板 auto_ptr,在memory这个头文件中。

(1)生命周期结束时,销毁指向的内存空间

(2)不能指向堆数组,只能指向堆对象(变量)

(3)一片堆空间只属于一个智能指针对象

(4)多个智能指针对象不能指向同一片堆空间

既然auto_ptr是一个类模板,所以使用时就要指定类型参数。如a:auto_ptr<Test> pt(new Test()); pt.get();可以返回pt所指向的空间的内存起始地址.

5、STL中的其他智能指针

(1)shared_ptr:带有引用计数机制,所以可以支持多个指针对象指向同一片内存空间

(2)weak_ptr:配合shared_ptr而引人的一种智能指针

(3)unique_ptr:一个指针对象只能指向一片内存空间,但是不能进行所有权的转移,所以就不能拷贝构造和赋值。

例:STL标准库中auto_ptr的使用

#include <iostream>

#include <string>

#include <memory> //auto_ptr这个智能指针类模板就在这个头文件中

using namespace std;

/*

* STL标准库中的auto_ptr智能指针类模板的使用。

* auto_ptr的特点:

* 生命周期结束时,销毁指向的内存空间

* 不能指向堆数组,只能指向堆对象(变量)

* 一片堆空间只属于一个智能指针对象

* 多个智能指针对象不能指向同一片堆空间

*/

class Test

{

private:

string m_name;

public:

Test(const char *name)

{

m_name = name;

cout << "Hello." << "I‘m " << name << endl;

}

void print()

{

cout << "why_fangqingqing " << endl;

}

~Test()

{

cout << "Goodbye " << m_name << endl;

}

};

int main(void)

{

auto_ptr<Test> pt1(new Test("why"));

cout << "pt1 = " << pt1.get() << endl; //获取指向的内存空间的起始地址

pt1->print();

auto_ptr<Test> pt2(pt1); //pt2指向了pt1指向的内存空间,pt1释放掉指向的内存空间,这是auto_ptr的特点,一片内存空间只能由一个auto_ptr指针对象指向

cout << "pt1 = " << pt1.get() << endl; // 0

cout << "pt2 = " << pt2.get() << endl;

pt2->print();

return 0;

}

6、Qt中的智能指针类模板

(1)QPointer,在Qt中包含QPointer头文件就可以使用这个QPointer智能指针类模板了

@1:当其指向的对象被销毁时,它会被自动置空。(也就是说可以多个QPointer智能指针指向同一个对象,当这个对象被销毁的时候,所有的指向这个对象的QPointer指针都变为空了)

@2:析构时不会自动销毁所指向的对象。(也就是说QPoniter指针生命周期结束的时候,不会自动删除所指向的对象(堆空间),我们要手动的delete掉,手动delete一次之后,所有指向这个堆

空间的QPointer指针都会被置为空)

(2)QSharedPointer,在Qt中的QSharedPointer头文件中。

@1:引用计数型智能指针

@2:可以被自由的拷贝和赋值

@3:当引用计数为0时才删除指向的对象(也就是,当这个对象被一次QSharedPointer指针指向时,就会加一次这个对象的引用的次数。当指向这个对象的QSharedPointer指针少一个时,

就会减一次这个对象的引用次数,直到减到没有一个QSharedPointer指针指向这个对象时,也就是这个对象被QSharedPointer指针引用次数为0时,才会销毁这个对象)

在Qt开发中,所有自己写的类,都要去继承QObject这个顶层父类,也就是基类。

7、Qt中的其他智能指针类模板

(1)QWeakPointer

(2)QScopedPointer

(3)QSharedDataPointer

(4)QExplicitlySharedDataPointer

例:

#include <QPointer>

#include <QSharedPointer>

#include <QString>

#include <QDebug>

/*

* Qt开发库中的QPointer智能指针和QSharedPo智能指针类模板的使用。

* QPointer的特点:

* @1:当其指向的对象被销毁时,它会被自动置空。

*  (也就是说可以多个QPointer智能指针指向同一个对象,当这个对象被销毁的时候,所有的指向这个对象的QPointer指针都变为空了)

* @2:析构时不会自动销毁所指向的对象。(也就是说QPoniter指针生命周期结束的时候,

* 不会自动删除所指向的对象(堆空间),我们要手动的delete掉,手动delete一次之后,所有指向这个堆空间的QPointer指针都会被置为空)

*/

/*

*   QSharedPointer的特点:

*   @1:引用计数型智能指针

*   @2:可以被自由的拷贝和赋值

*   @3:当引用计数为0时才删除指向的对象(也就是,当这个对象被一次QSharedPointer指针指向时,就会加一次这个

*   对象的引用的次数。当指向这个对象的QSharedPointer指针少一个时,就会减一次这个对象的引用次数,

*   直到减到没有一个QSharedPointer指针指向这个对象时,也就是这个对象被QSharedPointer指针引用次数为0时,才会销毁这个对象)

*/

class Test : public QObject //Qt中所有自己完成的类都要继承这个Qt中的QObject顶层父类,基类

{

private:

QString m_name;

public:

Test(const char *name)

{

m_name = name;

qDebug() << "Hello." << "I‘m " << name;

}

void print()

{

qDebug() << "why_fangqingqing ";

}

~Test()

{

qDebug() << "Goodbye " << m_name;

}

};

int main(void)

{

QPointer<Test> pt1(new Test("why"));

QPointer<Test> pt2(pt1);

qDebug() << "pt1 = " << pt1;

qDebug() << "pt2 = " << pt2;

pt1->print();

pt2->print();

delete pt1; //要手动的去delete掉pt1所指向的堆空间。编译器不会自动的去销毁,当生命周期结束时,delete掉后,所有指向这个空间

//的QPointer指针都会被置为空。

qDebug() << "pt1 = " << pt1;    //0

qDebug() << "pt2 = " << pt2;    //0

qDebug() << endl;

QSharedPointer<Test> spt1(new Test("fangqingqing"));    //这时这个堆空间的对象被QSharedPoin引用了一次

QSharedPointer<Test> spt2(spt1);    //这时这个堆空间的对象被QSharedPoin引用又加了一次

qDebug() << "spt1 = " << spt1;

qDebug() << "spt2 = " << spt2;

spt1->print();

spt2->print();

return 0;       //当那个堆空间的对象被QSharedPointer引用的次数减到0时,就会销毁这个堆空间的对象

}

7、自己实现一个智能指针类模板

#ifndef _SMARTPOINTER_H_

#define _SMARTPOINTER_H_

template

< typename T >

class Pointer

{

private:

T *mp;

public:

Pointer(T* p = NULL)

{

mp = p;

}

Pointer(const Pointer<T>& obj)

{

mp = obj.mp;

const_cast<Pointer<T>&>(obj).mp =NULL;

}

Pointer<T>& operator = (const Pointer<T>& obj)

{

if (this != &obj)

{

delete mp;

mp = obj.mp;

const_cast<Pointer<T>&>(obj).mp = NULL;

}

return *this;

}

T* get()

{

return mp;

}

T* operator -> ()

{

return mp;

}

T& operator * ()

{

return *mp;

}

~Pointer()

{

delete mp;

}

bool isNULL()

{

return (mp == NULL);

}

};

#endif

时间: 2024-08-02 11:01:40

C++智能指针类模板的相关文章

第61课 智能指针类模板

1. 智能指针的意义 (1)现代C++开发库中最重要的类模板之一 (2)C++中自动内存管理的主要手段 (3)能够在很大程度上避开内存相关的问题(如内存泄漏.内存的多次释放等) 2. STL中的智能指针 (1)auto_ptr智能指针 ①生命周期结束时,销毁指向的内存空间 ②只能用来管理单个动态创建的对象,而不能管理动态创建的数组.即不能指向堆数组,只能指针堆对象(变量) int* pn = new int[100]; auto_ptr<int> ap(pn); //auto_ptr指向堆数组

智能指针类模板(五十)

我们之前在 C++ 的学习中学习了有关智能指针的知识.那么智能指针的意义是现代 C++ 开发库中最重要的类模板之一:是 C++ 中自动内存管理的主要手段,它能够在很大程度上避开内存相关的问题.在 STL 标准库中的智能指针为 auto_ptr,它的特点是:1.生命周期结束时,销毁指向的内存空间:2.不能指向堆数组,只能指向堆对象(变量):3.一片堆空间只属于一个智能指针对象:4.多个智能指针对象不能指向同一片堆空间. 下来我们就来使用下 auto_ptr 智能指针 #include <iostr

【C++】智能指针类和OpenCV的Ptr模板类

智能指针类 引用计数 智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象的指针指向同一对象.引用计数为0时,删除对象. 其基本使用规则是: 每次创建类的新对象时,初始化指针并将引用计数置为1.当对象作为另一对象的副本而创建时,复制构造函数复制指针并增加与之相应的引用计数的值.对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数的值(如果引用计数减至0,则删除对

C++中智能指针的模板类

在C++中,智能指针是一个非常重要的概念.因为C++的类动态分配的对象不能自动释放掉,需手动调用new运算符.当程序员大意时,或程序发生异常时,或许就会发生没有手动释放内存而造成内存泄露. 智能指针的定义:就是在一个类中,存在一个指向另一个类对象的指针,并通过对指针运算符(比如:->,*)的重载,就可以实现利用当前类的对象通过指针运算符来操纵另一个类的成员(就像另一个类的指针操作一样),并且,在析构函数中定义了delete操作,借助于变量的作用域,能够实现类对象空间的自动释放. 在C++ 11中

智能指针类

//智能指针类 //---------------------------------------- //1.基数据放在使用计数类中 //实际类指向->使用计数类->基数据 //使用计数类 class U_ptr{ friend class Hasptr;//友元类 int *ip;//这个就是要保护的基数据 size_t use; U_ptr(int *p):ip(p),use(1){} ~U_ptr(){delete ip;} }; class Hasptr//实际类 { public:

C++自学笔记_定义智能指针类_《C++ Primer》

包含指针的类要特别注意复制控制,原因是复制指针只复制指针中的地址,而不会复制指针所指向的对象. C++类采用以下3种方法之一管理指针成员: (1) 指针成员采取常规指针型行为.这样的类具有指针所有的缺陷但是无需特殊的复制控制. (2) 类可以是实现“智能指针”行为.指针所指向的对象是共享的,但类能够防止悬垂指针. (3) 类采取值型行为.指针所指向的对象是唯一的,由每个类对象单独管理. 这里总结第(2)种方法——采用定义智能指针类 智能指针类的思想在于: 第(1)种方法中,所有的对象中的指针都直

13.5.1. 定义智能指针类

#include <iostream> #include<string> #include<set> using namespace std; //智能指针的使用 //智能指针类 class U_ptr { friend class hashptr; int *ip;//在hashptr中实际的需要定义的指针成员 size_t use;//使用次数的计数 U_ptr(int *p):ip(p),use(1){}//合成构造函数 ~U_ptr(){delete ip;}/

Effective c++--智能指针 &amp; 函数模板

Shared_ptr允许当智能指针被建立起来是指定一个资源释放函数绑定于智能指针身上,也就是说在shared_ptr被初始化的同时也可以指定其管理的资源的释放函数.Shared_ptr提供的某个构造函数接受两个实参:一个是被管理的指针,另一个是引用次数变为0时将被调用的"删除器".Shared_ptr构造函数坚持其第一个参数必须是个指针.它支持定制型删除器. 缺省情况下C++以by value方式传递对象至函数,这种情况下函数参数都是以实际参数的副本为初值,而调用端获得的也是函数返回值

智能指针的模板,用来管理动态分配的内存

#ifndef SMARTPTR_HPP #define SMARTPTR_HPP #include <stddef.h> template <typename T> class SmartPtr{ public: SmartPtr(T *type = NULL); void resetPtr(T *type); const T *getPtr()const; operator bool() const{ return ptr_ == NULL; } ~SmartPtr(); T