动态内存与智能指针

1 静态内存:保存局部static对象、类static成员、定义任何函数之外的变量

   栈内存:用来定义函数内的非static对象

   自由空间(堆):用堆来存储动态内存,动态内存与其他内存的区别在于,动态内存的生存期由程序控制


2 new     在动态内存中为对象分配一个空间,并返回一个指向该对象的指针

   delete  接受一个动态对象的指针,并销毁这个对象,释放与之关联的内存空间


3 标准库中有两种智能指针来管理动态对象:shared_ptr 允许多个指针指向同一个对象、unique_ptr独占所指向的对象

                                                                    weak_ptr弱引用伴随类,指向shared_ptr所管理的对象


4 智能指针与普通指针最大的区别在于,智能指针自动释放所指向的对象。


5 shared_ptr类

   shared_ptr<string> p1;创建一个智能指针,可以指向string

   shared_ptr<string> p2=make_shared<string>("mmm");   make_shared


6 strblob模板

   StrBlob b1;
    {
        string temp[] = { "a", "an", "the" };
        StrBlob b2(temp, temp + sizeof(temp)/sizeof(*temp));
        b1 = b2;  
        b2.push_back("about");
        cout << b2.size() << endl;
    }

    cout << b1.size() << endl;  b2被销毁了,但是temp的内容仍然被b1保存着


7 直接管理动态内存:new分配内存,delete释放内存

   int *p1=new int;  未定义的int,delete p1是错误的,因为未定义

   int *p1=new int(); *p1为0

   string *p2=new string(10,'9');

   vector<int> *p3=new vector<int>{0,1,2,3,4,5,6,7};

8 shared_ptr与new可以结合使用

   shared_ptr<double> p1;

   shared_ptr<int> p2(new int(42)); 必须使用直接初始化,使用等于号的是间接初始化,错误

   p2.reset(new int(1024));指向一个新对象


9 unique_ptr 只能有一个unique指定一个给定对象,定义一个unique_ptr时要将它绑定到一个new返回的指针上。

   unique_ptr<int> p(new int(42));不支持拷贝与赋值

   unique_ptr<string> p2(p1.release());  release放弃对*p1的控制权,将*p1空间置空,并返回指针,相当于票转移给p2

   p2.reset(p3.release()); 从p3转移给p2;

   quto p=p2.release(); 不用另一个智能指针保存返回的指针要记得delete p;


10 weak_ptr 不控制对象所指向对象的生存期,指向一个shared_ptr管理的对象。

     auto p=make_shared<int>(42);

     weak_ptr<int> wp(p);  p的引用


11 动态数组

      typedef int arrt[42];

      int *p=new arrt;          p指向第一个int,new返回的是一个元素类型的指针

      int *p=new int[42]();   初始化为0的int

      int *p=new int[42]{0,1, 2, 3, 4, 5};

      int n;

      int *p=new int[n];合法

      delete [] p;

 

12 智能指针与动态数组

     unique_ptr<int[]> up(new int[10]);

     up[1]=1;  up[i] 返回up拥有的数组中,i处的位置


13 allocator类

     将内存分配与构造对象分离开 ,它分配的内存是原始的,未构造的。

     allocator<string> a;

     a.allocate(10);



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值