C++new实现机制
2016-04-24 16:19
357 查看
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
传入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);
}
调用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];
}
}
2.2复杂数据类型(需要由构造函数初始化对象)
先根据类似简单类型给对象分配内存空间,然后在分配的内存上再调用构造函数初始化对象
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
传入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);
}
调用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];
}
}
2.2复杂数据类型(需要由构造函数初始化对象)
先根据类似简单类型给对象分配内存空间,然后在分配的内存上再调用构造函数初始化对象
相关文章推荐
- PCA人脸识别学习及C语言实现
- C++中的RTTI机制解析
- c++作业4
- C++常用字符串分割方法(转)
- 【c/c++】bitset
- C++ 嵌套类与外围类间的成员访问
- C++ string类
- [C/C++11]_[初级]_[使用std::tuple元组-固定大小的集合]
- 单词数测量
- [C/C++11]_[初级]_[使用std::tuple元组-固定大小的集合]
- 扩展欧几里德
- c++中的四种强制类型转换关键字
- 值得推荐的C/C++框架和库
- 后缀表达式(逆波兰表达式),并求值(可求浮点、负数与大于10的数),C++实现
- C/C++内存泄漏及检测
- c++实现简单矩阵类Mat
- VC++快捷操作大全
- C++:浅谈工厂模式与抽象工厂模式
- C++的静态成员函数,成员变量,构造函数,析构函数,拷贝构造函数
- C++中数字与字符串之间的转换