(十二)动态内存与智能指针
来源:互联网 发布:sql 执行存储过程 编辑:程序博客网 时间:2024/05/21 06:00
shared_ptr<T> p;
shared_ptr<int> p = make_shared<int>(42);//效率比下面的高shared_ptr<int> p2(new int(42));//不推荐,为了避免智能指针与普通指针的混用,所以最后使用make_shared,这样在内存分配之后立刻与智能指针绑定到一起.
new 如果失败,会抛出异常
RAII 确保资源得以释放,除非线程意外被终止,否则会进行栈展开,释放栈对象.
HANDLE handle;//Created or openedshared_ptr<HANDLE> hClose( &handle, []( HANDLE* h ){CloseHandle( h ); } );
unique_ptr 独占智能指针,不支持拷贝赋值等操作.除非这个unique_ptr将要被销毁,这种情况,编译器执行一种特殊的"拷贝"
unique_ptr<int> p1(new int(42));unique_ptr<int> p2(p1);//errorunique_ptr<int> p3 = p1;/errorunique_ptr<int> clone(int p){ unique_ptr<int> ret(new int(p)); return ret; //ok}
weak_ptr 等同于shared_ptr,但是不会增加使用技术,不会释放对象.
auto p = make_shared<int>(10);weak_ptr<int>wp(p);if(shared_ptr<int> np = wp.lock()){ //使用np访问共享对象}
不会影响对象的生存期,但是可以阻止用户访问一个不再存在的对象的企图,(不会影响吗?经测试,会影响,shared_ptr<int> np = wp.lock() 之后会增加使用计数)
动态数组:
2种方法,new type[num];allocator
new int[20]; 这样的并非是一个数组类型,不能使用begin或end,也不能使用范围for;
delete [] p;
智能指针管理动态数组
unique_ptr<int[] up(new int[10]);
当unique_ptr指向数组时,可以用下标访问元素
shared_ptr不支持管理动态数组,如果使用shared_ptr管理动态数组,需要提供自定义的删除器
shared_ptr<int> sp(new int[20],[](int *p){delete[] p;});
访问需要 sp.get() 获取内置指针,这样不方便.
allocator
把内存分配和对象构造分离开来
allocate 分配内存
construct 构造
destroy 析构
deallocate 释放内存 必须与allocate的指针,大小一样.
0 0
- (十二)动态内存与智能指针
- 动态内存与智能指针
- 动态内存与智能指针
- 动态内存与智能指针
- 动态内存与智能指针
- 动态内存与智能指针
- 动态内存与智能指针
- 动态内存与智能指针
- 动态内存与智能指针
- 动态内存与智能指针
- 动态内存与智能指针
- 动态内存与智能指针
- C++中的动态内存与智能指针
- C++中的动态内存与智能指针
- C++中的动态内存与智能指针
- C++中的动态内存与智能指针
- C++中的动态内存与智能指针
- C++中的动态内存与智能指针
- Coursera2014 Machine Learning -Andrew Ng Week 1 程序实现(Matlab or Octave)
- 使用sprintf() sscanf()转换字符串
- Raw-OS源码分析之消息系统-Queue_Size
- autolayout
- openssl中aes、rsa算法的使用
- (十二)动态内存与智能指针
- 【android studio】解决模拟器无法打开问题
- find命令之exec
- excel打印二维码
- asp.net调试报错:IE8下验证您是服务器上"Debugger users"组的成员
- 输出最高最低分
- ASP.net中的配置文件学习
- poj 1019 分块
- 职场中需要什么样的朋友?