深圳网站. 方维网络,企业简介怎么写,电力建设网站,网站上线除了备案还需要什么目录 1、C/C内存划分
C语言的动态内存管理
malloc
calloc
realloc
free
C的动态内存管理
new和delete
operator new函数和operator delete函数
new和delete的原理
new T[N]原理
delete[]的原理 1、C/C内存划分 1、栈#xff1a;存有非静态局部变量、函数参数、返回…目录 1、C/C内存划分
C语言的动态内存管理
malloc
calloc
realloc
free
C的动态内存管理
new和delete
operator new函数和operator delete函数
new和delete的原理
new T[N]原理
delete[]的原理 1、C/C内存划分 1、栈存有非静态局部变量、函数参数、返回值等。
2、内存映射段用于装载共享的动态内存库用户可使用系统接口创建共享内存做进程间通信。
3、堆用于程序运行时动态内存的分配。
4、数据段存有全局数据和静态数据。
5、代码段存有可执行代码、只读变量。 2、C语言的动态内存管理
C语言使用malloc、calloc、relloc、free等函数管理动态内存。
malloc void* malloc (size_t size); 功能向堆申请一块size字节连续可用的空间并返回指针 开辟成功返回指向已开辟好的空间的指针 开辟失败则返回空指针 calloc void* calloc (size_t num, size_t size); 功能为num个大小为size字节的元素向堆申请开辟一块空间并且把空间的每个字节都初始化为0。 与malloc区别在于malloc不会初始化。 realloc void* realloc (void* ptr, size_t size); 功能重新分配内存块该内存块后面有足够的空间就进行原地扩容不够就异地扩容在堆上找另一块空间合适的连续空间使用先将原来内存的数据拷贝到这个内存块中在释放原来的空间 free void free (void* ptr); 功能释放分配的空间。如果参数ptr指向的空间不是动态开辟的那free函数的行为是未定义的。如果参数ptr是NULL指针则函数什么事都不做。 3、C的动态内存管理
new和delete
C兼容C语言。C语言内存管理方式虽然在C中可以继续使用但在有些地方并不够完善而且使用起来比较麻烦。
因此C又提出了自己的内存管理方式通过new和delete操作符进行动态内存管理。 在申请自定义类型的空间时new会调用构造函数delete会调用析构函数而malloc与free不会。
new对应deletenew[]对应delete[]必须两两匹配不匹配的话就是未定义行为。 operator new函数和operator delete函数
new和delete是用户进行动态内存申请和释放的操作符operator new 和operator delete是系统提供的全局函数new在底层调用operator new全局函数来申请空间delete在底层通过operator delete全局函数来释放空间。
operator new函数功能 1、调用malloc去分配空间申请成功就直接返回 2、申请空间失败就会抛出异常 operator delete函数功能 operator delete 最终是通过free来释放空间的。 扩展不重要
operator new源码
/*
operator new该函数实际通过malloc来申请空间当malloc申请空间成功时直接返回
申请空间失败尝试执行空间不足应对措施如果改应对措施用户设置了则继续申请否则抛异常。
*/
void* __CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{void* p;while ((p malloc(size)) 0)if (_callnewh(size) 0){// 如果申请内存失败了这里会抛出bad_alloc 类型异常static const std::bad_alloc nomem;_RAISE(nomem);}return (p);
}operator delete源码
#define free(p) _free_dbg(p, _NORMAL_BLOCK)
void operator delete(void *pUserData)
{_CrtMemBlockHeader * pHead;RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));if (pUserData NULL)return;_mlock(_HEAP_LOCK);__TRYpHead pHdr(pUserData);_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead-nBlockUse));_free_dbg( pUserData, pHead-nBlockUse );__FINALLY_munlock(_HEAP_LOCK);__END_TRY_FINALLYreturn;
}new和delete的原理
如果申请的是内置类型的空间new和mallocdelete和free基本类似不同的地方是
new/delete申请和释放的是单个元素的空间new[]和delete[]申请的是连续空间而且new在申
请空间失败时会抛异常malloc会返回NULL。
new的原理
new等价于operate new()构造函数先申请空间后在申请的空间上调用构造operate new()并不是new的重载因为其参数没有自定义类型。
/*
operator new该函数实际通过malloc来申请空间当malloc申请空间成功时直接返回
申请空间失败尝试执行空间不足应对措施如果改应对措施用户设置了则继续申请否则抛异常。
*/
void* __CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{void* p;while ((p malloc(size)) 0)if (_callnewh(size) 0){// 如果申请内存失败了这里会抛出bad_alloc 类型异常static const std::bad_alloc nomem;_RAISE(nomem);}return (p);
}
由底层代码可以看出operator new是对malloc的封装。
delete原理
delete等价于operator delete()析构函数先调用析构再用operator delete释放对象空间。
#define free(p) _free_dbg(p, _NORMAL_BLOCK)
void operator delete(void *pUserData)
{_CrtMemBlockHeader * pHead;RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));if (pUserData NULL)return;_mlock(_HEAP_LOCK);__TRYpHead pHdr(pUserData);_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead-nBlockUse));_free_dbg( pUserData, pHead-nBlockUse );__FINALLY_munlock(_HEAP_LOCK);__END_TRY_FINALLYreturn;
}由底层代码可以看出operator delete()调用了free。
针对有资源要释放的对象时必须使用deletefree只是释放了对象的空间却没有释放对象内部的空间。 new T[N]原理
1、先调用operator new[]函数operator new[]中实际调用operator new函数完成N个对象空间的申请。
2、再调用N次构造函数完成N个对象的初始化。
delete[]的原理
1、先调用N次析构函数完成N个对象中资源的清理
2、再调用operator delete[]释放空间实际在operator delete[]中调用operator delete来释放空间