智能指针的本质:
本质是存放在栈上的模拟对象只是在栈内部包了一层指针,指针指向的是堆内存。到时一同释放。
shared_ptr内部的引用计数是线程安全的,但是对象的读取需要加锁,它初始化传入指针通过构造函数或者使用make_shared函数,不能将指针直接赋值给一个智能指针,一个是类,一个是指针。
(1)拷贝使得对象的引用计数加1,赋值使其减1。当为0时,自动释放内存。后来的对象引用计数加1,指向后来的对象。
(2)get函数获取原始指针,不要用一个原始指针初始化多个shared_ptr,否则会造成二次释放同一内存。
(3)注意避免循环引用,shared_ptr的一个最大的陷阱时循环引用,循环引用会导致堆内存无法正确释放,导致内存泄漏。