设为首页 加入收藏

TOP

4.2 C++ Boost 内存池管理库(五)
2023-08-26 21:10:33 】 浏览:219
Tags:4.2 Boost 池管理
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使用的,其

首页 上一页 2 3 4 5 6 下一页 尾页 5/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【QT性能优化】QT性能优化之QT6框.. 下一篇7.1 C++ STL 非变易查找算法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目