书名 BOOK TITLE
《Primer c++ 第5版》
基本信息 BASICS
- 阅读进度:第12章动态内存
阅读心得 LEARNINGS
- 在c++中,我知道的有静态内存、栈内存、和动态内存三种,其中 静态内存的成员用static修饰,一旦声明,及时是在局部的函数内部使用,也得等到整个程序结束才会消失。(这里我的疑问,我还从没见过静态的指针变量,这种变量可以有吗?如果存在,它属于静态内存还是动态内存?它该怎么消亡。)
- 栈内存,是用在函数块里面声明的变量,其特点是变量在出了作用域块之后,就自动出栈,并且先构建的变量要后出栈。
- 最后个动态内存,它是在堆上的内存,普通形式就是以指针的形式存在在代码中。可用智能指针(shared_ptr、unique_ptr、weak_ptr)降低使用难度,如果是普通的指针,无论是在函数块内还是成员变量,如果不手动delete,它会一直存在(程序结束了,都没有释放内存,这个内存它还存在吗?我猜,是不会存在的,因为在操作系统上,一个进程或线程结束了,其中的内存就会被回收掉,而一个程序有可能就是线程或者进程)
- delete只能进行一次,如果删除了还继续删除,其行为是未定义的(会不会造成这个内存无法在被回收分配了?)
- delete之后,会产生空悬指针,其危害和未初始的指针一样,所以在初始化和删除指针时都要进行 ptr=NULL的操作。
- delete还有这样的问题,例子:
int* ptr1=new int(4); int *ptr2=ptr1; delete ptr1; ptr1=NULL; ptr2=NULL; //这里我们在指针赋值之后,删除了ptr1,并置为空指针,这个时候ptr2也释放了, //但并不能让ptr2也重置为空指针,所以需要把ptr2也置为空指针。 //我觉得如果不这样做,在判断ptr2是否为空这里就会出现问题。
7. 当在delete指针之前,发生了异常,并且没有使用try catch,那么这个内存将不会被释放掉。
------------------------------------------------------智能指针部分
1. 我也是第一次接触这个东西,总结起来十分的吃力。智能指针需要引用头文件<memory>。首先我的理解是指向这个内存的智能指针“指向“数量变为0了,程序就会自动释放掉这个内存。分享型智能指针允许有多个分享型指针指向同一内存;unique类型的,只允许一个指针指向这个内存;弱指针,用弱指针指向的内存不增加指向计数。这是我的总体上的了解,下面进行更细致的了解。
2. 智能指针p可以作为判断条件,如果p指向了一个对象则 if(p)为true。
3.分享型智能指针拷贝,作为参数传递给函数,作为函数的返回值,都会增加指针计数器。
4. 当我们给 “分智”指针赋予新值或是被销毁,指针计数器会减1.(被销毁具体指哪些?)
5. “分智”指针 ,若p.use_count()==1 ,则p.unique() 会return true; else return false;
6. shared_ptr<T>p(u),从unique_ptr,将u置为空。
7. 不要使用get初始化另一个智能指针。考虑这样的代码:
shared_ptr<int> p(new int(42)); int * q = p.get(); { shared_ptr<int>m(q); } int foo = *p; cout << foo << endl;//输出一串很大的数字
8. 使用自己定义的释放函数释放智能指针,及时发生了异常同样能被释放。例如:
void end_conn(conn*p){disConn(*p);} void f(destination &d,...){ conn c=connect(&d); shared_ptr<conn>p(&c,end_conn); //这里的c不是new的,所以要传递一个自己写的删除器end_conn; }
9. unique_ptr试图拷贝一个unique_ptr指针是错误的。
10. weak_ptr中,w.expired()表示 如果指针计数为0,则这个弱指针过时了,返回true。
11. w.lock() 若expired返回true,则 lock返回空指针,否则返回一个shared_ptr。