0.前置知识
1.知识点
1.1 RAII
1.2 理解深拷贝与浅拷贝;
1.3 掌握使用引用计数解决浅拷贝问题;
1.4 在引用计数实现中,理解写时拷贝技术;
2.理解深拷贝与浅拷贝
2.1 浅拷贝:某种程度上可以节省空间,但可能存在一个空间多次重复释放的问题.
2.2 深拷贝:可以解决可能存在的一个空间多次重复释放的问题,但有可能造成造成空间的浪费.
3.理解深拷贝与浅拷贝各自的优缺点
4.使用引用计数解决浅拷贝实现中出现的问题
5.解决引用计数中的写时拷贝技术实现
1.RAII
在传统的C++中需要程序员记得用delete对自己用new申请的堆内存进行释放,对于C++而言最早在98版引入智能指针的概念,之后的C++11做了加强,让程序员不需要关心手动释放内存。解决这个问题的灵感之一来源于RAII。RAII-Resource Acquisition Is Initialization(资源获取就是初始化),利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源。RAII在C++11中的内存回收设计上的应用的关键词就是栈对象和析构函数。
2.RAII思想体会
// -std=c++11
#include <iostream>
using namespace std;
class RAII
{
public:
RAII()
{
std::cout << "RAII Object Constructor" << endl;
m_pInt = new int;
}
~RAII()
{
std::cout << "RAII Object Destructor" << endl;
if(m_pInt!=nullptr)
{
delete m_pInt;
}
}
private:
int* m_pInt;
};
void test()
{
RAII raiiobj;
};
int main()
{
test();
}
3.吸取深拷贝和浅拷贝的精华
4.考虑引用计数节省空间
5.利用好写时复制技术解决值改变问题