C++new实现机制
来源:互联网 发布:卢松松博客大全源码 编辑:程序博客网 时间:2024/05/19 13:57
C++new实现机制
1.new和delete最终调用malloc和free
2.new操作数据类型两种:
2.1基本数据类型
int *p=new int;
00E8139E push 4
00E813A0 call operator new (0E81172h)
00E813A5 add esp,4
00E813A8 mov dword ptr [ebp-0D4h],eax
00E813AE mov eax,dword ptr [ebp-0D4h]
00E813B4 mov dword ptr [p],eax
00E813A0 call operator new (0E81172h)
00E813A5 add esp,4
00E813A8 mov dword ptr [ebp-0D4h],eax
00E813AE mov eax,dword ptr [ebp-0D4h]
00E813B4 mov dword ptr [p],eax
传入4个字节参数,然后调用operetor new重载函数(new操作符重载看下)
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{ // try to allocate size bytes
void *p;
while ((p = malloc(size)) == 0)
if (_callnewh(size) == 0)
{ // report no memory
static const std::bad_alloc nomem;
_RAISE(nomem);
}
return (p);
}
{ // try to allocate size bytes
void *p;
while ((p = malloc(size)) == 0)
if (_callnewh(size) == 0)
{ // report no memory
static const std::bad_alloc nomem;
_RAISE(nomem);
}
return (p);
}
调用malloc失败后,会调用_callnewh函数,如果该函数的返回值为0,则抛出异常(下节说下new失败的处理)
注意:new分配内存失败后,会抛出异常,bad_alloc对象,而不是指针为NULL
这个_callnewh是什么呢?它是一个new handler,通俗来讲就是new失败的时候调用的回调函数。可以通过_set_new_handler来设置。下面举个实例:
- #include <stdio.h>
- #include <new.h>
- int MyNewHandler(size_t size)
- {
- printf("Allocation failed.Try again");
- return 1; //continue to allocate
- //return 0; //stop allocating,throw bad_alloc
- }
- void main()
- {
- // Set the failure handler for new to be MyNewHandler.
- _set_new_handler(MyNewHandler);
- while (1)
- {
- int* p = new int[10000000];
- }
- }
先根据类似简单类型给对象分配内存空间,然后在分配的内存上再调用构造函数初始化对象
0 0
- C++new实现机制
- new/delete与new[]/delete[]实现机制
- C++new delete 实现原理
- C++new和delete实现原理
- C++new和delete实现原理
- 【C++】模拟实现new[]和delete[]
- C++new和delete实现原理
- 转载:Python中的new style class机制实现
- C++内存管理:new的实现以及模拟set_new_handler机制
- c new
- C++new
- 【c++】new
- Thread new 的机制
- placement new机制初探
- placement new机制初探
- c++ new handler机制
- 【C++】new delete & new[] delete[]
- 用C模拟实现COM机制
- 使用gulp 完成前端自动化
- 介绍 JSON
- 第一次注册csdn博客
- 5-31笛卡尔树(25 分)
- mysql学习之1——mysql不同引擎的区别
- C++new实现机制
- scrollview嵌套listview运行后最先显示出来的位置不在顶部而是中间问题
- 21届BQConf中国软件质量大会(西安)总结
- mysql学习之2——mysql索引
- 第二专题总结
- 安卓中的:内存泄漏 和 内存溢出
- 项目经验之技术总结-2016
- CC2530 的一些小例子
- 创建静态类,定义一个泛型方法,实现查找数组元素的功能。