hared
{
private:
class impl;
boost::shared_ptr<impl> ptr;
public:
MyShared();
void print();
};
// 定义桥接类
class MyShared::impl
{
public:
void print()
{
cout << "输出桥接类" << endl;
}
};
MyShared::MyShared() :ptr(new impl){}
void MyShared::print()
{
ptr->print();
}
int main(int argc, char const *argv[])
{
MyShared lsp;
lsp.print();
std::system("pause");
return 0;
}
2.6 使用SharedPtr工厂模式
在C++中,shared_ptr还可以与工厂模式(Factory Design Pattern)结合使用,工厂模式是一种创建型设计模式,该模式包装了new
操作符的使用,使对象的创建工作集中在工厂类或工厂函数上,通过创建和返回智能指针,从而实现动态创建对象并自动管理其生命周期的功能。
通常开发中,自己编写的工厂类都会在堆上使用new
动态分配对象,然后返回对象指针,当忘记释放delete
时,内存泄漏就会产生。当使用shared_ptr
实现工厂模式时,我们可以将工厂类中的创建对象的方法返回一个shared_ptr
对象,从而避免手动管理动态分配的内存。
如下代码所示,我们使用shared_ptr
封装接口,让impl
类不再返回原始指针,而是返回shared_ptr
包装的智能指针,这样就可以很好的保护资源。
#include <iostream>
#include <boost/smart_ptr.hpp>
using namespace std;
using namespace boost;
// 定义基类 全部为虚函数
class abstract
{
public:
virtual void MyPrint() = 0;
protected:
virtual ~abstract() = default;
};
// 派生类实现虚函数
class impl :public abstract
{
public:
impl() = default;
virtual ~impl() = default;
public:
virtual void MyPrint()
{
cout << "调用方法完成." << endl;
}
};
// 工厂函数返回基类的 基址指针 返回类型为 shared_ptr
boost::shared_ptr<abstract> create()
{
return boost::make_shared<impl>();
}
int main(int argc, char const *argv[])
{
// 第一种调用方式
auto ptr = create();
ptr->MyPrint();
// 第二种方式
abstract *abstract_ptr = ptr.get();
abstract_ptr->MyPrint();
// 强制转换,后输出
impl *impl_ptr = (impl*)(ptr.get());
impl_ptr->MyPrint();
std::system("pause");
return 0;
}
2.7 使用SharedPtr资源共享
使用shared_ptr
实现资源共享时,我们可以创建多个shared_ptr
对象,让它们共同管理同一个动态分配的对象,从而避免了内存泄漏和错误释放内存的情况。
如下案例中我们定义了shared_vector
类,当MyShared
中的内容发生变化时,由于ptr
指向了MyShared
类,则ptr
中的值也会随着MyShared
中的内容的变化而变化。
#include <iostream>
#include <memory>
#include <vector>
#include <string>
using namespace std;
class shared_vector
{
public:
typedef vector<string>::size_type size_type;
shared_vector() : data(make_shared<vector<string>>()){}
shared_vector(initializer_list<string> il) : data(make_shared<vector<string>>(il)){}
size_type size()const{ return data->size(); }
bool empty()const{ return data->empty(); }
//尾部插入删除元素
void push_back(const string& s){ data->push_back(s); }
void pop_back(){ data->pop_back(); }
//访问元素
string& front(){ return data->front(); }
string& back(){ return data->back(); }
private:
shared_ptr<vector<string>> data;
};
int main(int argc, char const *argv[])
{
shared_vector MyShared{ "admin", "lyshark" };
shared_vector ptr(MyShared);
ptr.push_back("administrator");
cout << "发生变化: " << MyShared.back() << endl;
std::system("pause");
}
2.8 使用WeakPtr智能指针
weak_ptr是C++11
中的智能指针,它用于解决shared_ptr
可能引起的循环引用问题。与shared_ptr
不同,weak_ptr
并不持有所指对象的所有权,因此它不能直接访问所指向的对象。它只是提供了一种通过shared_ptr
访问所指向对象的方式,并且在没有引用时可以自动弱化其引用。
在使用weak_ptr
时,通常需要先从一个shared_ptr
对象创建一个weak_ptr
对象。我们可以通过lock()
函数获取指向所指对象的shared_ptr对象,然后通过这个shared_ptr
对象来访问所指对象。
如果简单来说,这个指针的出现只是为了配合shared_ptr
使用的,其