目录
2.1.C:malloc /calloc /realloc /free
2.2.C++内存管理方式 : 通过new和delete操作符进行动态内存管理
一.内存分布
1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。
2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口
创建共享共享内存,做进程间通信。
3. 堆用于程序运行时动态内存分配,堆是可以上增长的。
4. 数据段--存储全局数据和静态数据。
5. 代码段--可执行的代码/只读常量。
二. C/C++语言中动态内存管理方式
2.1.C:malloc /calloc /realloc /free
2.2.C++内存管理方式 : 通过new和delete操作符进行动态内存管理
注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与
free不会!!!
三.new和delete的原理
3.1 new和malloc delete和free
1.new和malloc,delete和free 基本类似.
2.不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。
new的实现 和 malloc:
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
// 如果申请内存失败了,这里会抛出bad_alloc 类型异常
static const std::bad_alloc nomem;
_RAISE(nomem);
}
return (p);
}
delete的实现 和 free:
void operator delete(void *pUserData)
{
_CrtMemBlockHeader * pHead;
RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
if (pUserData == NULL)
return;
_mlock(_HEAP_LOCK); /* block other threads */
__TRY
/* get a pointer to memory block header */
pHead = pHdr(pUserData);
/* verify block type */
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
//释放空间
_free_dbg( pUserData, pHead->nBlockUse );
__FINALLY
_munlock(_HEAP_LOCK); /* release other threads */
__END_TRY_FINALLY
return;
}
3.2 new的原理 和 operator new
new :
先调用 operator new 函数申请空间再申请的空间上执行构造函数,完成对象的构造。
operator new :
实际也是通过malloc来申请空间,但不会自动调用构造函数.
3.3 delete的原理 和 operator delete
delete :
先在空间上执行析构函数,完成对象中资源的清理工作,再调用 operator delete 函数释放对象的空间.
operator delete:
最终是通过free来释放空间的,但不会自动调用析构函数.
3.4 new T[N]的原理 和 delete[]的原理
1. new T[N] :先调用operator new[] 函数,在operator new[] 中实际调用 operator new函数完成N 个对象空间的申请,再申请的空间上执行N次构造函数
2. delete[] :先释放的对象空间上执行N次析构函数,完成N个对象中资源的清理,再调用 operator delete []释放空间 ,实际在operator delete[]中调用operator delete来释放空间