[C++] 动态内存

我的个人网站: [https://taohaoke.club/blog]
1、动态分配的对象的生存期与它们在哪里创建是无关的,只有当显式地被释放时,这些对象才会销毁——这是编程很容易出错的地方,智能指针类型就是用来管理动态分配的对象,它们可以保证当一个对象应该被释放的时候,指向它的智能指针可以确保自动地释放它

2、分类:shared_ptr、unique_ptr、weak_ptr。shared_ptr最早实现于boost库中,后来称为C++11标准的一部分

3、shared_ptr的引用计数:当拷贝一个shared_ptr的时候,比如用一个shared_ptr初始化另一个shared_ptr,或者将它作为参数传递给一个函数、或者作为函数的返回值,计数器就会递增;当给一个shared_ptr赋予一个新值或者shared_ptr被销毁时,计数器就会递减。

4、程序使用动态内存的原因:1)程序不知道自己需要使用多少对象。2)程序不知道所需对象的准确类型。3)程序需要在多个对象间共享数据

5、newdelete
1)定位new:允许向new传递额外的参数,nothrow传递给new,当不能分配内存的时候不会抛出bad_alloc的异常,会返回一个空指针。

2)delete表达式接受一个指针,指向要释放的对象;传递给delete的指针必须指向动态分配的内存,或者是一个空指针。释放一块非new分配的内存,或者将相同的指针释放多次,其行为是未定义的。delete执行两个动作:销毁给定的指针指向的对象;释放对应的内存。

3)分配一个动态数组:int *p = new int[n];//n是整型
释放一个动态数组:delete []p;//方括号是必须的,否则行为未定义

6、unique_ptr
1)某个时刻只能有一个unique_ptr指向一个给定对象。当unique_ptr被销毁时,它所指向的对象也被销毁了。
2)定义unique_ptr,将其绑定到一个new 返回的指针上:unique_ptr<int>p(new int (42))
3)由于一个unique_ptr拥有他指向的对象,所以unique_ptr不支持普通的拷贝或者赋值操作。
4)unique_ptr中的release()reset()用来将指针的所有权从一个(非const)unique_ptr转移给另一个unique_ptr,因为release是放弃对象的拥有权,并返回指针,reset可以重定向指针,在参数为空的情况下会释放指针。

7、删除器,用户可以定义自己的删除器,shared_ptr和unique_ptr在释放的时候会进行调用。

8、weak_ptr:指向一个由shared_ptr管理的对象,但是不会改变shared_ptr的引用计数。当shared_ptr被销毁的时候,对象也会被销毁,所以weak_ptr指向的对象可能不存在,因此weak_ptr不能直接访问对象,而是必须调用lock()当对象不存在的时候返回一个空的shared_ptr,否则返回指向对象的shared_ptr。

9、可以用unique_ptr来管理new分配的数组:
unique_ptr<int[]>up(new int[n]);
释放数组:up.release();

原文地址:https://www.cnblogs.com/zhizhiyu/p/10116728.html