C++智能指针模板应用详细介绍
智能指针的概念
在C++中,当我们使用new创建了一个对象时,需要手动的调用delete来释放内存。但是,如果在某个地方忘记释放内存,就会导致内存泄漏问题。为了避免这个问题,我们可以使用智能指针来管理内存。
一个智能指针是一个类,它行为像一个指针,但它还额外提供了内存管理的功能。智能指针类会通过在构造函数中调用new和在析构函数中调用delete,自动的管理所指向的内存。
智能指针的分类
C++中有三种常用的智能指针:unique_ptr、shared_ptr、weak_ptr。
unique_ptr
unique_ptr是对裸指针的包装,保证对象在生命周期的某个时刻一定会被删除。unique_ptr是独占所有权的,一个对象只能由一个unique_ptr管理。
unique_ptr的构造函数是explicit的,因此只能从一个与其类型相同的unique_ptr来构造另一个unique_ptr。这个限制避免了将一个unique_ptr指针误传或误赋给其他类型指针的问题。
shared_ptr
shared_ptr是一种可以被多个智能指针共享所有权的指针。shared_ptr能够记录有多少智能指针在共享同一个对象,所有的shared_ptr在对象的引用计数变为0之前都有效,当计数为0时,shared_ptr会自动调用delete释放该对象的内存。
weak_ptr
weak_ptr是为了避免shared_ptr的循环引用问题而设计的,它是一种不控制对象生命周期的智能指针,也可以说是一种弱引用。弱引用是指不能改变一个对象的生命周期。
weak_ptr可以从一个shared_ptr或另一个weak_ptr对象构造,它的构造和复制都不会引起引用计数的增加。weak_ptr可以通过lock()函数来获得一个有效的shared_ptr指针,该函数会检查weak_ptr指针指向的对象是否存在,如果存在返回一个新的shared_ptr,否则返回一个空的shared_ptr。
智能指针的应用场景
智能指针可以用在需要动态分配内存的使用场景中,例如管理一个资源的所有权,实现类对象的互相关联等。智能指针也可以用在单元测试中,帮助我们管理资源的申请和释放。
示例代码
unique_ptr示例
#include <iostream>
#include <memory>
using namespace std;
class Person {
public:
Person(string name) {
this->name = name;
cout << "construct " << name << endl;
}
~Person() {
cout << "destruct " << name << endl;
}
private:
string name;
};
int main() {
unique_ptr<Person> person(new Person("Jack"));
return 0;
}
输出结果:
construct Jack
destruct Jack
shared_ptr示例
#include <iostream>
#include <memory>
using namespace std;
class Person {
public:
Person(string name) {
this->name = name;
cout << "construct " << name << endl;
}
~Person() {
cout << "destruct " << name << endl;
}
private:
string name;
};
int main() {
shared_ptr<Person> shared_person1(new Person("Jack"));
shared_ptr<Person> shared_person2 = shared_person1;
cout << "the count of shared_ptr is " << shared_person1.use_count() << endl;
return 0;
}
输出结果:
construct Jack
the count of shared_ptr is 2
destruct Jack
从输出结果可以看出,shared_ptr的引用计数是2,也就是说有两个shared_ptr指向同一个Person对象。当程序结束时,Person对象的析构函数被调用,内存被正确释放。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++智能指针模板应用详细介绍 - Python技术站