其他分享
首页 > 其他分享> > RAII 与 智能指针

RAII 与 智能指针

作者:互联网

小彭老师的课程

RAII

所谓的RAII,全称为Resource Acquisition Is Initialization,汉语是“资源获取即初始化”。但是这个直译并没有很好地解释这个词组的含义。其实含义并不高深复杂,简单说来就是,在资源获取的时候将其封装在某类的object中,利用"栈资源会在相应object的生命周期结束时自动销毁"来自动释放资源,即,将资源释放写在析构函数中。所以这个RAII其实就是和智能指针的实现是类似的

初始化表达式

explicit

{}与()调用构造函数的区别

{}调用构造函数会防止narrow_cast,也就是不准精度损失

POD(plain-old-data)陷阱

默认构造函数:无参数

拷贝构造与拷贝赋值

拷贝赋值会将原来的对象中的数据销毁

C++11初始化列表

对于一个class中不存在相应构造函数,那么以()初始化的对象,会编译错误

有自定义构造函数时仍然想用默认构造函数:= default

当一个类有其他构造函数的时候,自动生成一个参数个数和成员一样的构造函数这个构造函数就没有了,并且对空参构造函数使用=deafault也不能恢复之前的那个构造函数,这很正常吧?

std::string 不支持拷贝构造吗?

支持的,这里只是做的假设

三五法则

内容

如果一个类定义了解构函数,那么您必须同时(定义或删除)拷贝构造函数和拷贝赋值函数,否则出错。


之所以需要重定义或者删除拷贝赋值,拷贝赋值也是编译器自动生成的浅拷贝
这里是低效的拷贝赋值,因为需要析构原来的内容,但是方便,因为可以复用拷贝构造函数
但是这个placement new暂时不是很明白?

这是高效的拷贝赋值,在原有的内容上realloc,不用销毁原有的内容

移动语义

对于将亡值v2,这里仍然去使用?
一些会自动调用移动语义的情况
对于return甚至可以返回左值,return std::as_const(v2)

没太看懂?

这里是v1掉用拷贝构造一个临时的对象,在传递个v2的移动构造赋值

智能指针

C++98时,delete只是把new出来的内存标记为没有被使用,但是现在的指针p还是指向那块内存;
而智能指针,只需要p = nullptr就可以完成置空与delete两步操作,符合封装性思想

由于三五法则,unique_ptr删除了拷贝构造函数
如何传递unique_ptr到函数中:

标签:初始化,RAII,指针,智能,C++,拷贝,构造函数,ptr,赋值
来源: https://www.cnblogs.com/mlmz/p/16034128.html