C++11新特性【智能指针与匿名函数】

本文深入探讨了C++11的两大特性:智能指针(shared_ptr, weak_ptr)及其使用注意事项,以及匿名函数(lambda表达式)的捕获列表、简写形式。通过实例解析了如何避免智能指针的内存泄漏问题,特别是通过weak_ptr解决循环引用。同时介绍了lambda表达式的灵活性和在函数体内捕获外部变量的方式。" 81265976,7362173,YAPTCHA 与威尔逊定理的运用,"['数论', '算法', '数学应用']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

智能指针

shared_ptr共享的智能指针

shared_ptr的基本用法

使用shared_ptr要注意的问题

weak_ptr弱引用的智能指针

weak_ptr的基本用法

weak_ptr返回this指针

weak_ptr解决循环引用问题

weak_ptr使用注意事项

匿名函数lambda

匿名函数lambda

捕获列表

匿名函数的简写


前言

  本文重点是C++11智能指针与匿名函数

  本专栏知识点是通过零声教育的线上课学习,进行梳理总结写下文章,对c/c++linux课程感兴趣的读者,可以点击链接 C/C++后台高级服务器课程介绍 详细查看课程的服务。

智能指针

C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。程序员自己 管理堆内存可以提高了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的 概念,方便管理堆内存。使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常 时内存泄露等问题等,使用智能指针能更好的管理堆内存。

C++里面的四个智能指针: auto_ptr,** unique_ptr,shared_ptr, weak_ptr** 其中后三个是C++11支持, 并且第一个已经被C++11弃用。

shared_ptr共享的智能指针

std::shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。再最后一个shared_ptr析 构的时候,内存才会被释放。

shared_ptr共享被管理对象,同一时刻可以有多个shared_ptr拥有对象的所有权,当最后一个 shared_ptr对象销毁时,被管理对象自动销毁。

简单来说,shared_ptr实现包含了两部分,

一个指向堆上创建的对象的裸指针,raw_ptr

一个指向内部隐藏的、共享的管理对象。share_count_object

shared_ptr的基本用法

1. 初始化

通过构造函数、std::shared_ptr辅助函数和reset方法来初始化shared_ptr,代码如下:

std::shared_ptr<int> p1(new int(1));
std::shared_ptr<int> p2 = p1;
std::shared_ptr<int> p3;
p3.reset(new int(1));
if(p3) {
    cout << "p3 is not null";
}

我们应该优先使用make_shared来构造智能指针,因为他更高效。

auto sp1 = make_shared<int>(100);
//相当于
shared_ptr<int> sp1(new int(100));

不能将一个原始指针直接赋值给一个智能指针,例如,下面这种方法是错误的:

std::shared_ptr<int> p = new int(1);

shared_ptr不能通过“直接将原始这种赋值”来初始化,需要通过构造函数和辅助方法来初始化。 对于一个未初始化的智能指针,可以通过reset方法来初始化,当智能指针有值的时候调用reset会引起 引用计数减1。

另外智能指针可以通过重载的bool类型操作符来判断。

// 1-1-reset-count
#include <iostream>
#include <memory>
using namespace std;
int main()
{
    std::shared_ptr<int> p1;
    p1.reset(new int(1));
    std::shared_ptr<int> p2 = p1;
    // 引用计数此时应该是2
    cout << "p2.use_count() = " << p2.use_count()<< endl;
    p1.reset();
    cout << "p1.reset()\n";
    // 引用计数此时应该是2
    cout << "p2.use_count()= " << p2.use_count() << endl;
    if(!p1) {
        cout << "p1 is empty\n";
    }
    if(!p2) {
        cout << "p2 is empty\n";
    }
    p2.rese
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值