一,回调函数 回调函数的创建步骤大概为: 1,声明一个函数指针类型。 2,拟写使用回调函数的函数,将函数指针类型及变量名声明作为参数传递。...3,拟写符合函数指针类型的实现函数,将实现函数的指针作为参数传递给使用它的函数。...std::placeholders::_1 代表可调用对象的第一个参数,_2就代表第二个参数,依此类推。...std::endl; return EXIT_SUCCESS; } 对 std::bind 的额外注解: 1,调用指向非静态成员函数指针或指向非静态数据成员指针时...,首参数必须是引用或指针(可以包含智能指针,如 std::shared_ptr 与 std::unique_ptr),指向将访问其成员的对象。
assign函数是将原字符串清空然后用新的字符串赋值。...接下来将this+240这个指针(就是this指针偏移240个字节)传递给agent作为初始化用。也就是说webserver的对象指针偏移240个字节的位置保存了一个指向agent对象的指针。...this偏移1552字节的位置的指针)这个指针指向的,创建了一个string元素,然后通过push_back添加到vector中,再将这个string对象删除。...这个函数指针也就是对应到具体的字典值 0x05 字节数与结构体偏移 ida里伪代码有时候会以数组方式对结构体进行寻址,这时候每个下标都是8字节,而结构体里每个成员的大小并不都是8个字节,因此下标会和结构体的成员对不上...我们看一下源码定义 可以看到大部分都是指针,所有指针都是8字节,所以不用管指针 这里有apr_int64和普通的int,普通int占4字节,apr_int64其实就是long也就是8字节,以此类推。
仅当在编辑阶段知道序列将存储多少位时才能使用bitset。 vector可动态的添加标志 vector是对std::vector的部分具体化,用于存储布尔数据。...实例化: vector vecBool(10, true); 即它最初包含10个布尔元素,且每个元素都被初始化为 1 (即true) 理解智能指针 智能指针类重载了解除引用运算符(*')...和成员选择运算符(->),让程序员可以像使用常规指针那样使用它们....引用计数智能指针 引用计数是一种记录对象的用户数量的机制。当计数降低到零后,便将对象释放。因此,引用计数提供了一种优良的机制,使得可共享对象而无法对其进行复制。...破坏性复制 std::auto_ptr是最流行(也可以说是最臭名昭著,取决于您如何看)的破坏性复制指针。被传递给函数或复制给另一个指针后,这种智能指针就没有用了。即源指针也被销毁了。
,现在共有3个局部智能指针对象,但np 和 np2 的成员ptr_ 已经被设置为0;第二次new 的Node对象已经被释放,现在np3.ptr_ 指向第一次new 的Node对象,程序结束,np3局部对象析构...在本文最前面的程序中,虽然实现了禁止拷贝,但如上所述,对象语义对象的生存期仍然是不容易控制的,下面将通过智能指针auto_ptr 来解决这个问题,通过类比上面NodePtr 类的实现可以比较容易地理解...,再插入容器,在这里再提一点,就是vector 只负责裸指针本身的内存的释放,并不负责指针指向内存的释放,假设一 个MultipleNode 类有成员vector vec_; 那么在类的析构函数中需要遍历容器...,如果 std::vector::push_back(val); 成功(operator new 成功),那么局部智能指针对象释放裸指针的所有权;如果 std::vector:...此外,在Ptr_vector 类中还重载了push_back,能够直接将智能指针作为参数传递,在内部插入裸指针成功后,释放所有权。
print(const std::vector& data);非常量指针不能指向常量对象const double pi = 3.14double *ptr = π //❌,非常量指针不能指向常量对象顶层指针...智能指针分为:shared_ptr/unique_ptr/weak_ptr三种;shared_ptr:多个智能指针共享一个对象,支持拷贝和赋值,每次拷贝或赋值后对象的引用计数加1,智能指针销毁一次,引用计数减...智能指针使用陷进同一内置指针值不能初始化多个智能指针,避免资源被多次释放智能指针get()返回的内置指针不能初始化或者reset另一个智能指针,也不允许手动delete get()返回的内置指针使用get...()返回的内置指针,当智能指针引用计数为0时,该内置指针也将失效。...每个虚继承的子类都有一个虚基类指针(占用一个指针的存储空间,4字节)和虚基类表(不占用类对象的存储空间)当派生类重新定义虚函数时,则将派生类的虚函数的地址添加到虚函数表中。
在本文最前面的程序中,虽然实现了禁止拷贝,但如上所述,对象语义对象的生存期仍然是不容易控制的,下面将通过智能指针auto_ptr 来解决这个问题,通过类比上面NodePtr 类的实现可以比较容易地理解...,再插入容器,在这里再提一点,就是vector 只负责裸指针本身的内存的释放,并不负责指针指向内存的释放,假设一 个MultipleNode 类有成员vector vec_; 那么在类的析构函数中需要遍历容器...,如果此时内存耗尽,operator new 失败,push_back 抛出异常,此时裸指针既没有被智能指针接管,也 没有插入vector(不能在类的析构函数中遍历vector 进行delete 操作)...,如果 std::vector::push_back(val); 成功(operator new 成功),那么局部智能指针对象释放裸指针的所有权;如果 std::vector::push_back...此外,在Ptr_vector 类中还重载了push_back,能够直接将智能指针作为参数传递,在内部插入裸指针成功后,释放所有权。
,现在共有3个局部智能指针对象,但np 和 np2 的成员ptr_ 已经被设置为0;第二次new 的Node对象已经被释放,现在np3.ptr_ 指向第一次new 的Node对象,程序结束,np3局部对象析构...在本文最前面的程序中,虽然实现了禁止拷贝,但如上所述,对象语义对象的生存期仍然是不容易控制的,下面将通过智能指针auto_ptr 来解决这个问题,通过类比上面NodePtr 类的实现可以比较容易地理解...,再插入容器,在这里再提一点,就是vector 只负责裸指针本身的内存的释放,并不负责指针指向内存的释放,假设一 个MultipleNode 类有成员vector vec_; 那么在类的析构函数中需要遍历容器...,如果 std::vector::push_back(val); 成功(operator new 成功),那么局部智能指针对象释放裸指针的所有权;如果 std::vector::...此外,在Ptr_vector 类中还重载了push_back,能够直接将智能指针作为参数传递,在内部插入裸指针成功后,释放所有权。
使用 C++ 智能指针遇到的坑 阅读收益 智能指针目的就是代替原始指针,那么问题来了,原始指针都可以用智能指针代替吗?...开始 C++11 中推出了三种智能指针,unique_ptr、shared_ptr 和 weak_ptr,同时也将 auto_ptr 置为废弃 (deprecated)。...但是在实际的使用过程中,很多人都会有这样的问题: 不知道三种智能指针的具体使用场景 无脑只使用 shared_ptr 认为应该禁用 raw pointer(裸指针,即 Widget * 这种形式),全部使用智能指针...unique_ptr 代替全部原始指针吗? 答:不是的,如果使用不当会造成 core 或者 不执行析构函数。 在类的成员,或者函数参数传递。...vector容器类型,因为当vector扩容时,智能指针便不再生效,引起程序的崩溃或未定义的行为。
如果两个deque的第一个元素相等,那么继续比较第二个元素,以此类推。...push_back操作可以将元素添加到队列的尾部,而pop_front操作则可以从队列的头部移除元素。...例如,在一个任务调度系统中,任务可以被添加到队列的末尾,然后按照顺序从队列头部取出任务进行处理 void Test() { deque taskQueue; // 将任务添加到队列...vector maxSlidingWindow(const std::vector& nums, int k) { vector result; deque...在 C++ 学习的浩瀚星空中,我们都是执着的追光者,每一次成功解析一个晦涩的错误,每一回透彻理解一个精妙的算法,都是我们穿越星际迷雾的胜利。
第二个要求是将适当的实例化模板类型添加到类型系统中的必要条件,因为 SWIG 不会自动实例化模板。有关包装模板的更多一般信息,请参阅模板部分。...7.3.5 通用智能指针 SWIG 以与支持boost::shared_ptr相同的方式为std::shared_ptr提供特殊的智能指针处理。请参阅shared_ptr 智能指针库部分。...9.4.4 shared_ptr 智能指针 一些目标语言支持处理 shared_ptr 引用计数智能指针。这个智能指针在标准 C++11 库中作为std::shared_ptr 可用。...SWIG 的正常但有些有限的智能指针处理完全不同。...9.4.5 auto_ptr 智能指针 尽管std::auto_ptr 在 C++11 中已弃用,但一些现有代码可能仍在使用它,因此 SWIG 为此类提供有限的支持:std_auto_ptr.i 定义了适用于返回此类型对象的函数的类型映射
内置类型无析构函数,因此销毁内置类型成员什么也不做。 隐式销毁一个内置指针类型的成员不会delete它指向的对象。但是智能指针是类类型,所以具有析构函数,因此指向的对象在析构阶段会被销毁。...&) = delete; // 阻止赋值 ~Nocopy() = default; // 合成的析构函数 // 其他成员 }; 6.2 析构函数不能是删除的成员 如果析构函数被删除,那么无法销毁此类型的对象...如果一个类需要管理类外资源,那我们首先必须确定此类型对象的拷贝语义。...std::string *first_free; // 指向数组第一个空闲元素的指针 std::string *cap; // 指向数据尾后位置的指针 }; void...因此当我们编写一个移动操作时,必须确保移后源对象进入一个可析构的状态。我们的StrVec的移动操作满足这一要求,这是通过将移后源对象的指针成员置为nullptr来实现的。
;同时由于是编译器自动推导,各种类型忽略问题以及转换问题我们都需要重视以std::vector为例,std::vector是std::vector的一个特化版本,容器中的bool...与STL中的其他容器不同,std::vector::operator[]返回的不是bool&,而是返回std::vector::reference,这个reference能够转换为...::underlying_type_t>(enumerator); } noexcept •大多数函数都是异常中立的,此类函数自身并不会抛出异常,但是它们调用的函数可能会抛出异常。...(或者使用智能指针,注意std::shared_ptr按引用捕获的时候,不会累加引用次数) 但按值捕获也不一定能保证悬垂安全,例如对this指针的捕获 初始化捕获 初始化捕获是C++14中引入的新特性,...C++11后若访问到已delete的函数,那么会在编译阶段就得到错误,将错误诊断提前了 = delete 可以用来修饰任何函数,包括非成员函数和模板具现 template void
比如b1和b2是两个StrBlob对象,如果此vector保存在b2中,那么当b2离开作用域时此vector也会被销毁。为了保证此vector中的元素继续存在,我们将vector保存在动态内存中。...(); private: std::shared_ptrstd::vectorstd::string>> data; // 如果data[i]不合法,抛出一个异常 void...check(size_type i, const std::string &msg) const; } // 构造函数:两个都使用初始化列表来初始化data成员, 令它指向一个动态分配的vector...、赋值和销毁 StrBolb使用默认版本的拷贝、赋值和销毁成员函数来对此类型的对象进行这些操作。...虽然编译器不会报错,但是将另一个智能指针也绑定到get返回的指针上是错误的。
同样的道理,如果我们定义了⼀个数组,并且有⼀个指针,指向数组起始位置,这个指针每秒钟向后⾛动⼀步,⾛到哪⾥,则代表哪⾥的任务该被执⾏了,那么如果我们想要定⼀个3s后的任务,则只需要将任务添加到tick+...返回延迟时间 uint32_t DelayTime() { return _timeout; } }; 3.3 TimeWheel时间轮类 注意:这里使用会使用智能指针...成员变量: 二维数组时间轮,每一节点储存PtrTask数组 当前时间指针 int _tick; 走到哪里 执行哪里的任务 表盘最大数量(默认60秒) 定时器任务ID映射表 unordered_map...将任务添加到时间轮中 TimerRefresh 刷新延迟定时任务:通过保存的定时器对象的Weak_ptr构造一个TaskPtr ,添加到时间轮中 RunTimerTask 运行任务时间轮,向后移动一个位置...// 最大容量 表盘最大数量(默认60秒) int _tick; // 移动表针 std::vectorstd:
vector扩容原理 在push_back()的时候会检查是否还有剩余空间,如果没有了,就申请一块原来尺寸2倍的空间,将原来的数据直接复制过去,然后把最后一个元素添加到最后面。并释放原来的空间。...&&t2){ f(std::forward(t1),std::forward(t2)); } 四种智能指针 shared_ptr 简介 从名字可以看出是一个共享指针,允许多个shared_ptr...注意get()到的指针不要再初始化另一个智能指针。...int foo=*p;//访问了释放掉的内存。 3.get()返回的指针不要去delete、reset其他智能指针、初始化其他智能指针。...实现一个shared_ptr智能指针 000000 参考:技术: C++ 智能指针实现 shared_ptr的线程安全性 C++11的四种强制类型转换 1.static_case(静态转换) 主要执行非多态的转换操作
*在线用户管理*/ std::vectorvector> _board;/*棋盘*/ public: }; 成员方法 私有成员方法 私有成员方法中,有两个成员方法,一个是判断是否五星连珠的方法...接下来,将一一实现: 成员变量 使用unordered_map将用户id与房间id映射起来,将房间id与管理房间的智能指针映射起来,方便通过房间id获取对应的房间的智能指针,以及通过用户id,找到房间id...在线的话,那么就创建房间,将玩家id加入房间中,接着将房间管理起来,最后返回这个房间的智能指针。...创建房间,将用户信息添加到房间中 std::unique_lockstd::mutex> lock(_mutex); //创建一个执行房间的智能指针 room_ptr...因此,首先先通过房间id获取房间的智能指针,然后通过房间的智能指针,获取玩家的id,然后将玩家从管理中移除,最后将房间移除。
也是一个标准库函数,输入一个数组,返回指向该数组首元素的指针。 end string和vector的成员,返回一个尾后迭代器。...(3)类类型 对于一个类来说,在我们创建他的对象之前该类必须被定义过,而不能仅被声明。 (4)友元 友元类 如果一个类指定了友元类,则友元类的成员函数可以访问此类包括非公有成员在内的所有成员。...)*, decltype(eqOp)*>; SD_multiset bookStore(42, haser, eqOp); 第十二章 动态内存 P400-P436 12.1 动态指针与智能指针 智能指针...空悬指针:一个指针,指向曾经保存一个对象但现在已释放的内存。 智能指针:标准库类型。负责在恰当的时候释放内存。...拷贝构造函数、移动构造函数定义了当用同类型的另一个对象初始化本对象时做什么。 拷贝赋值运算符、移动赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么。 析构函数定义了当此类型对象销毁时做什么。
第4章 智能指针 //智能指针式对裸指针进行包装,避免很对再使用裸指针时会遇到陷阱,为管理动态分配对象的生命周期设计 //通过保证这样的对象在适当的时机以适当的方式析构来防止内存泄漏。...转换成 std: : shared _ptr 是容易实现的 //来自:C++11 unique_ptr智能指针详解 (biancheng.net) 成员函数名 功 能 operator*() 获取当前...operator->() 重载 -> 号,当智能指针指向的数据类型为自定义的结构体时,通过 -> 运算符可以获取其内部的指定成员。...::make_unique , 利用C++11实现一个基础版本的 std::make_unique //将形参向待创建对象的构造函数作了一次完美转发,并返回一个指涉到该对象的智能指针 //这个形式的函数不支持数组和自定义析构器...生存期史久的 std: :weak_ptr 条款22:使用 Pimpl习惯用法时,将特殊成员函数得定义放到实现文件中 //Pimpl :pointer to implementation 指涉到实现得指针
bind()函数的一大优势是可以匹配任何可调用对象,包括函数、成员函数、函数指针、成员函数指针等。...,在绑定成员函数时,必须将其绑定到对象或者指针上,因此使用bind绑定时需要牺牲一个占位符的位置,该绑定最多支持绑定8个参数。...function使用起来非常灵活,可以将函数指针、函数对象、成员函数指针等各种可调用对象作为输入参数,并且可以绑定一部分函数参数,生成新的函数对象。...函数对象f2将MyClass对象obj的成员函数my_member_func的第二个参数设为20,第一个参数为绑定参数。...function是一个函数对象的容器,是一种智能函数指针,其以对象形式封装,可用于函数的回调,暂时保管函数或函数对象,在需要的时候在调用,能够更好的实现回调。
领取专属 10元无门槛券
手把手带您无忧上云