1.STL中的智能指针auto_ptr
(1)生命周期结束时,销毁指向的内存空间
(2)不能指向堆数组,只能指向堆对象(变量)
(3)一片堆空间只属于一个智能指针对象
(4)多个智能指针对象不能指向同一片堆空间
需要加 #include<memory> //智能指针头文件
#include <iostream>
#include<string>
using namespace std;
#include<memory> //智能指针头文件
class Test {
string m_name;
public:
Test(const char* name) {
cout << "Hello, " << m_name << "." << endl;
m_name = name;
}
void print() {
cout << "I'm " << m_name << "." << endl;
}
~Test() {
cout << "Goodbye, " << m_name << "." << endl;
}
};
int main() {
auto_ptr<Test> pt(new Test("nhc")); //定义智能指针pt,指向类Test的对象
pt->print();
return 0;
}
运行结果:
Hello, .
I'm nhc.
Goodbye, nhc.
一片堆空间只属于一个智能指针对象,所以下面代码只执行一次析构函数,并且堆空间对象的所有权属于pt
#include <iostream>
#include<string>
using namespace std;
#include<memory> //智能指针头文件
class Test {
string m_name;
public:
Test(const char* name) {
cout << "Hello, " << m_name << "." << endl;
m_name = name;
}
void print() {
cout << "I'm " << m_name << "." << endl;
}
~Test() {
cout << "Goodbye, " << m_name << "." << endl;
}
};
int main() {
auto_ptr<Test> pt(new Test("nhc")); //定义智能指针pt,指向类Test的对象
cout << "pt=" << pt.get() << endl; //get是返回堆空间的起始地址
pt->print();
auto_ptr<Test> pt1(pt); //定义智能指针pt1指向堆空间的pt
cout << "pt=" << pt.get() << endl;
cout << "pt1=" << pt1.get() << endl;
pt1->print();
return 0;
}
运行结果:
Hello, .
pt=00E029C8
I'm nhc.
pt=00000000 //所有权转移,有pt转给pt1
pt1=00E029C8
I'm nhc.
Goodbye, nhc.
2.STL中其他的智能指针
(1)shared_ptr 是带有引用计数机制,支持多个指针对象指向同一片内存
(2)weak_ptr 是配合shared_ptr而引入的一种智能指针
(3)unique_ptr 一个指针对象指向一片内存空间,不能拷贝构造和赋值,即不能进行所有权转移
3.QT中的智能指针
(1)QPointer
当其指向的对象被销毁时,他会自动置空;析构时不会自动销毁所指向的对象
(2)QSharedPointer
引用计数型智能指针;可以被自由的拷贝和赋值;当引用计数为0时才删除指向的对象
#include <QPointer>
#include <QDebug>
class Test : public QObject
{
QString m_name;
public:
Test(const char* name) {
qDebug() << "Hello, " << m_name << "." ;
m_name = name;
}
void print() {
qDebug() << "I'm " << m_name << "." ;
}
~Test() {
qDebug() << "Goodbye, " << m_name << "." ;
}
};
int main() {
QPointer<Test> pt(new Test("nhc"));
QPointer<Test> pt1(pt);
QPointer<Test> pt2(pt);
pt->print();
pt1->print();
pt2->print();
delete pt;
qDebug()<<"pt = "<<pt;
qDebug()<<"pt1 = "<<pt;
qDebug()<<"pt2 = "<<pt;
}
运行结果:
Hello, nhc.
I'm nhc.
I'm nhc.
I'm nhc.
Goodbye, nhc.
pt = QPointer(nullptr)
pt1 = QPointer(nullptr)
pt2 = QPointer(nullptr)
当pt被删除释放后,pt1和pt2也会置空,所以不会重复释放