九、 通用工具 ----动态内存管理---new
来源:互联网 发布:2016年网络知识竞赛 编辑:程序博客网 时间:2024/06/08 02:35
2 new
<new>
中定义了几种函数,这些函数负责动态内存的分配;
2.1 类型
- nothrow_t: nothrow 类型
- new_handler: new 处理函数的函数指针类型
- bad_alloc : 分配内存失败抛出的异常
- bad_array_new_length :数组长度不正确的异常
常量:
- nothrow : nothrow常量
2.2 函数
- operator new : 分配存储空间
- operator new[]:分配存储空间给数组
- operator delete:释放分配存储空间
- operator delete[]:释放分配的数组存储空间
- set_new_handler :注册一个 new 处理函数
- get_new_handler :获得当前的 new 处理函数
当operator new申请一个内存失败的时候,它会进行如下的处理步骤:
1、如果存在客户指定的处理函数,则调用处理函数(new_handler),如果不存在则抛出一个异常。
2、继续申请内存分配请求。
3、判断申请内存是否成功,如果成功则返回内存指针,如果失败转向处理步骤1
例子:
#include <iostream>#include <new>void handler(){ std::cout << "Memory allocation failed, terminating\n"; std::set_new_handler(nullptr);}int main(){ std::set_new_handler(handler); try { while (true) { new int[100000000ul]; } } catch (const std::bad_alloc& e) { std::cout << e.what() << '\n'; }}//----------u输出为:Memory allocation failed, terminatingstd::bad_alloc
这个分配内存失败,然后调用客户设定的new_handler处理函数;
2.3 new的分配方式
- plain new :普通的new
- nothrow new: 不抛出异常的new
- placement new : 放置new,在已经分配的内存上重新构造对象或者数组;placement new不用担心内存分配失败,因为它根本不分配内存,它做的唯一一件事情就是调用对象的构造函数
提示1:palcement new的主要用途就是反复使用一块较大的动态分配的内存来构造不同类型的对象或者他们的数组。
提示2:placement new构造起来的对象或其数组,要显示的调用他们的析构函数来销毁,千万不要使用delete。
// 第一种 void* operator new(std::size_t) throw(std::bad_alloc); void operator delete(void *) throw();//第二种 void * operator new(std::size_t,const std::nothrow_t&) throw(); void operator delete(void*) throw();//第三种 void* operator new(size_t,void*); void operator delete(void*,void*);//第三种实例char* p = new(nothrow) char[100];long *q1 = new(p) long(100);//在p的内存上重新构造int *q2 = new(p) int[100/sizeof(int)];
【详细文档】
1. c++中new的三种用法详细解析
阅读全文
0 0
- 九、 通用工具 ----动态内存管理---new
- 九、 通用工具 ----动态内存管理--allocator
- 动态内存管理---new&delete
- 动态内存管理new&delete
- 动态内存管理(new/delete)
- C++的动态内存管理,new/delete
- 动态管理内存之new和delete
- C++动态内存管理:new/delete
- 【C++】动态内存管理(new,delete,new[],delete[])
- 操作符 new 动态变量 基本内存管理
- c++ auto_str自动管理new 动态申请的内存
- 动态内存管理详解:malloc/free/new/delete/brk/mmap
- 动态内存管理详解:malloc/free/new/delete/brk/mmap
- 动态内存管理详解:malloc/free/new/delete/brk/mmap
- C++动态内存管理之深入探究new和delete
- <C++>7.new、delete动态管理堆内存
- 九、 通用工具 ----辅助函数
- 九、 通用工具 ----class ratio<>
- Java TCP 群聊
- 九、 通用工具 ----动态内存管理--allocator
- Samba配置文件常用参数详解
- Spark编程进阶之共享变量
- 主体结构元素 2
- 九、 通用工具 ----动态内存管理---new
- String,StringBuilder,StringBuffer对比分析
- JavaScript跨域总结与解决办法
- Java开发中的23种设计模式
- Android源码编译(一)环境配置,下载源码
- 在Hadoop上运行python程序错误集合
- 第1篇 初级排序算法
- 杂记:jenkins中用到的一些lunix命令
- 解耦-大宽表