1、智能指针本质上是对象,可以像本地人一样使用。 这是因为,在与智能指针的对象对应的类中,指针相关的操作都被进行了重载操作处理,所以能够得到这样的本机效果。
2、智能指针的含义:
当前c开发库中最重要的类模板之一
c中自动内存管理的主要手段
能够大幅避免存储器相关问题
3、QT在开发库中也提供了智能指针类模板。 STL标准库也提供了。 c的标准库中忘记了几个人,但也提供了智能指针类模板。 所以,智能指针类模板在c中的地位很重要
4、STL的智能指针类模板auto_ptr位于名为memory的头文件中。
(1)生命周期结束时,废弃积分的内存区域
)不能指向堆数组,只能指向堆对象(变量)
)3)一个堆区域只属于一个智能指针的对象
)4)多个智能指针的对象不能指向同一堆区域
因为auto_ptr是类模板,所以要指定和使用类型参数。 例如a:auto_ptrpt(newtest ) ); pt.get (; 可以返回pt所指区域的存储器起始地址。
5、STL的其他智能指针
)1) shared_ptr:具有引用计数机制,以支持多个指针对象指向同一存储器空间
)2) weak_ptr )与shared_ptr相匹配的有吸引力的智能指针
)3) unique_ptr个指针对象只能指向一个内存空间,但不能转移所有权,不能复制和赋值结构。
示例:使用STL标准库auto_ptr
#包含
#包含
名为#include //auto_ptr的智能指针模板位于此头文件中
用户命名空间STD;
/*
*使用STL标准库的auto_ptr智能指针模板。
*auto_ptr的特点:
*生命周期结束后,销毁指定的内存空间
*不能指向堆数组。 只能指向堆对象(变量)
*一个堆空间属于一个智能指针对象
*多个智能指针上的对象不能指向同一堆区域
*/
类测试
{
隐私:
string m_name;
公共:
测试(常数字符名称) ) )。
{
m_name=name;
cout 'Hello.' 'I'm ' name endl;
}
void打印() )
{
cout'why_fangqing'endl;
}
~Test () )
{
cout 'Goodbye ' m_name endl;
}
(;
输入主(语音) )。
{
auto_ptrpt1(newtest ) ' why ' );
cout 'pt1=' pt1.get () endl; //取得指示存储器空间的起始地址
pt1-print (;
auto_ptrpt2(pt1; //pt2指向pt1指定的存储空间,pt1释放指定的存储空间。 这是auto_ptr的特征,一个存储器空间只能由一个auto_ptr指针对象来指向
cout 'pt1=' pt1.get () endl; //0
cout 'pt2=' pt2.get () endl;
pt2-print (;
返回0;
}
6、Qt中的智能指针类模板
)1)只要在QPointer、Qt中包含QPointer头文件,就可以使用该QPointer智能指针类模板
@1:如果放弃指向的对象,它将自动为空。 (也就是说,如果多个QPointer智能指针可以指向同一对象,并且该对象被销毁,指向该对象的所有QPointer指针都将为空。)
@2)对于析构函数,不会自动销毁指向的对象。 (也就是说,当QPoniter指针的生命周期结束时,指向的对象(堆空间)不会自动删除。 我们手动删除。 手动删除后,所有指向此堆
空间中的所有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
#include
#include
#include
/*
*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 pt1(new Test("why"));
QPointer 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 spt1(new Test("fangqingqing")); //这时这个堆空间的对象被QSharedPoin引用了一次
QSharedPointer 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& obj)
{
mp = obj.mp;
const_cast&>(obj).mp =NULL;
}
Pointer& operator = (const Pointer& obj)
{
if (this != &obj)
{
delete mp;
mp = obj.mp;
const_cast&>(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