[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、new
和delete
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();