c++动态内存知识总结与疑问

书名  BOOK TITLE

  《Primer c++  第5版》

基本信息 BASICS

  1. 阅读进度:第12章动态内存

阅读心得 LEARNINGS

  1.  在c++中,我知道的有静态内存、栈内存、和动态内存三种,其中 静态内存的成员用static修饰,一旦声明,及时是在局部的函数内部使用,也得等到整个程序结束才会消失。(这里我的疑问,我还从没见过静态的指针变量,这种变量可以有吗?如果存在,它属于静态内存还是动态内存?它该怎么消亡。)
  2. 栈内存,是用在函数块里面声明的变量,其特点是变量在出了作用域块之后,就自动出栈,并且先构建的变量要后出栈。
  3. 最后个动态内存,它是在堆上的内存,普通形式就是以指针的形式存在在代码中。可用智能指针(shared_ptr、unique_ptr、weak_ptr)降低使用难度,如果是普通的指针,无论是在函数块内还是成员变量,如果不手动delete,它会一直存在(程序结束了,都没有释放内存,这个内存它还存在吗?我猜,是不会存在的,因为在操作系统上,一个进程或线程结束了,其中的内存就会被回收掉,而一个程序有可能就是线程或者进程)
  4. delete只能进行一次,如果删除了还继续删除,其行为是未定义的(会不会造成这个内存无法在被回收分配了?) 
  5. delete之后,会产生空悬指针,其危害和未初始的指针一样,所以在初始化和删除指针时都要进行 ptr=NULL的操作。
  6. 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。

原文地址:https://www.cnblogs.com/HelloQLQ/p/12582671.html