阿里地区网站建设_网站建设公司_门户网站_seo优化
2025/12/24 16:43:59 网站建设 项目流程

智能指针

独占指针——unique_ptr

  1. 在任何给定的时刻,只能有一个指针管理内存
  2. 当指针超出作用域时,内存将自动释放
  3. 该类型指针不可 Copy,只可以 Move

创建方式

有如下三种创建方式,但最推荐的是第三种。

独占指针的创建
//1.通过 原始指针创建
cat* c_p1 = new  cat("Tom");
std::unique_ptr<cat> u_c_p2(c_p1);
//两个指针都可以访问原始对象
c_p1->cat_info();	
u_c_p2->cat_info();
//通过原始指针 修改名字
c_p1->set_name("Jerry");
//引用相同 对象名称改变
u_c_p2->cat_info();	
//为了满足unique_ptr的独占语义 我们需要销毁c_p1
delete c_p1;
c_p1 = nullptr;//2.通过 new创建
std::unique_ptr<cat> u_c_p3(new cat("Kitty"));
u_c_p3->cat_info();//3.通过 make_unique 创建(最推荐的使用方法 )
std::unique_ptr<cat> u_c_p4 = std::make_unique<cat>("Mimi");
u_c_p4->cat_info();

传递方式

  1. 值传递:值传递时会发生拷贝构造,但独占指针表示只能有唯一的引用,因此使用值传递时,必须要转移指针的所有权。这种情况会导致每一次传递独占指针都需要去转移所有权非常麻烦**。
值传递
void Foo(std::unique_ptr<cat> c)
{c->cat_info();
}int main()
{//1.Pass Valuestd::unique_ptr<cat> c1 = std::make_unique<cat>("Mimi");c1->cat_info();//指针所有权转移,c1不再拥有该指针Foo(std::move(c1));//c1已经不再拥有该指针,不能再使用c1->cat_info();//此处报错//以下方式会隐式调用Move 转移所有权Foo(std::make_unique<cat>("111"));
}
  1. 引用传递(推荐):引用传递时,为了防止误操作修改原有独占指针代表的地址。最好使用const进行修饰(一个指向固定地址的指针常量)。
引用传递
void Foo1(const std::unique_ptr<cat> &c)
{c->set_name("NewName");c->cat_info();//不允许修改指针本身。//c.reset();
}int main()
{//2.Pass referencestd::unique_ptr<cat> c2 = std::make_unique<cat>("Jerry");Foo1(c2);c2->set_name("Tom");c2->cat_info();
}
  1. 作为返回值:可以实现链式编程,并且独占指针保证了指向的唯一性。
作为返回值
std::unique_ptr<cat> Foo2()
{std::unique_ptr<cat> c3 = std::make_unique<cat>("Kitty");return c3;
}int main()
{Foo2()->cat_info();
}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询