最近在忙自己的研究生科研工作和尽量在不看源码的情况下写一个玩具版的muduo(我已经看过陈硕的《Linux多线程服务端编程:使用muduoC++网络库》,相当于按自己的理解再写一遍),没太有时间写C++对象模型的后面部分,等组会开完后再继续写。今天就写一下几天前看到的一个小技巧,也即标题:std::weak_ptr绑定到所有类型的std::shared_ptr。std::weak_ptr我们知道weak_ptr目的是为了防止只使用std::shared_ptr导致的循环引用,从而导致内存泄漏。一个经典的例子如下:#include#include#include#includeclassChil
最近在忙自己的研究生科研工作和尽量在不看源码的情况下写一个玩具版的muduo(我已经看过陈硕的《Linux多线程服务端编程:使用muduoC++网络库》,相当于按自己的理解再写一遍),没太有时间写C++对象模型的后面部分,等组会开完后再继续写。今天就写一下几天前看到的一个小技巧,也即标题:std::weak_ptr绑定到所有类型的std::shared_ptr。std::weak_ptr我们知道weak_ptr目的是为了防止只使用std::shared_ptr导致的循环引用,从而导致内存泄漏。一个经典的例子如下:#include#include#include#includeclassChil
SQLUNIQUE约束SQLUNIQUE约束UNIQUE约束唯一标识数据库表中的每条记录。UNIQUE和PRIMARYKEY约束均为列或列集合提供了唯一性的保证。PRIMARYKEY约束拥有自动定义的UNIQUE约束。请注意,每个表可以有多个UNIQUE约束,但是每个表只能有一个PRIMARYKEY约束。CREATETABLE时的SQLUNIQUE约束下面的SQL在"Persons"表创建时在"P_Id"列上创建UNIQUE约束:MySQL:CREATETABLEPersons(P_IdintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarcha
SQLUNIQUE约束SQLUNIQUE约束UNIQUE约束唯一标识数据库表中的每条记录。UNIQUE和PRIMARYKEY约束均为列或列集合提供了唯一性的保证。PRIMARYKEY约束拥有自动定义的UNIQUE约束。请注意,每个表可以有多个UNIQUE约束,但是每个表只能有一个PRIMARYKEY约束。CREATETABLE时的SQLUNIQUE约束下面的SQL在"Persons"表创建时在"P_Id"列上创建UNIQUE约束:MySQL:CREATETABLEPersons(P_IdintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarcha
1smartpointer思想 个人认为smartpointer实际上就是一个对原始指针类型的一个封装类,并对外提供了->和*两种操作,使得其能够表现出原始指针的操作行为。 要理解smartpointer思想首先要了解一个概念RAII(ResourceAcquisitionIsInitialization),直译为资源获取即初始化,核心理念为在对象创建时分配资源,而在对象销毁时释放资源. 根据RAII理念,如果对象创建在栈(stack)上,由于栈上的对象在销毁是会自动调用析构函数,因此仅仅需要在构造函数内完成资源分配,而在析构函数内完成资源释放,此时程序员就不需要自己关心资源的释放
1smartpointer思想 个人认为smartpointer实际上就是一个对原始指针类型的一个封装类,并对外提供了->和*两种操作,使得其能够表现出原始指针的操作行为。 要理解smartpointer思想首先要了解一个概念RAII(ResourceAcquisitionIsInitialization),直译为资源获取即初始化,核心理念为在对象创建时分配资源,而在对象销毁时释放资源. 根据RAII理念,如果对象创建在栈(stack)上,由于栈上的对象在销毁是会自动调用析构函数,因此仅仅需要在构造函数内完成资源分配,而在析构函数内完成资源释放,此时程序员就不需要自己关心资源的释放
unique_lockcondition_variable1:lock_guard和unique_lock2:condition_variablewait和notify_all方式1std::mutexmtx;mtx.lock();.....mtx.unlock();//容易出现死锁方式2lock_guradlock(mtx)出作用域,自动析构(释放锁),缺陷:不能用在函数参数传递或者返回过程中.只能用在简单的临界区代码段的互斥操作中.方式3unique_lock不仅可以使用在简单的临界代码段的互斥操作中,还可以使用在函数调用过程中unique_lock(mtx)关于condition_var
unique_lockcondition_variable1:lock_guard和unique_lock2:condition_variablewait和notify_all方式1std::mutexmtx;mtx.lock();.....mtx.unlock();//容易出现死锁方式2lock_guradlock(mtx)出作用域,自动析构(释放锁),缺陷:不能用在函数参数传递或者返回过程中.只能用在简单的临界区代码段的互斥操作中.方式3unique_lock不仅可以使用在简单的临界代码段的互斥操作中,还可以使用在函数调用过程中unique_lock(mtx)关于condition_var
unique_ptr的成员函数在上一篇博客中几乎全部涵盖,其实还有一个很有踢掉,即std::unique_ptr::get_deleter字面已经很明显了,就获得deleter智能指针采通过引用计数我们能解决多次释放同一块内存空间的问题,并且和之间直接移交管理权的方式比较这种方式更加灵活安全。但是这种方式也只能处理new出来的空间因为new要和析构中的delete匹配,为了使能和new,malloc,fopen的管理空间匹配,我们需要定制删除器通过自定义删除器,可以实现一些场景下的资源释放和删除.代码1#include#includeusingnamespacestd;templateclas
unique_ptr的成员函数在上一篇博客中几乎全部涵盖,其实还有一个很有踢掉,即std::unique_ptr::get_deleter字面已经很明显了,就获得deleter智能指针采通过引用计数我们能解决多次释放同一块内存空间的问题,并且和之间直接移交管理权的方式比较这种方式更加灵活安全。但是这种方式也只能处理new出来的空间因为new要和析构中的delete匹配,为了使能和new,malloc,fopen的管理空间匹配,我们需要定制删除器通过自定义删除器,可以实现一些场景下的资源释放和删除.代码1#include#includeusingnamespacestd;templateclas