C++内存管理的理解
malloc、calloc、realloc 区别
void Test (){int* p1 = (int*) malloc(sizeof(int));free(p1);// 1.malloc/calloc/realloc的区别是什么?int* p2 = (int*)calloc(4, sizeof (int));int* p3 = (int*)realloc(p2, sizeof(int)*10);// 这里需要free(p2)吗?//这里不需要free(p2),//因为我们在realloc的时候,如果修改了原本的空间地址,会自动进行释放free(p3 );}//malloc不会对开辟的空间赋初始值
//calloc会对开辟的空间赋初始值
//realloc是对空间大小进行修改
new/delete 和 malloc/free 的区别
主要是针对自定义类型,我们的 C++主要是对类进行操作,也就是自定义类型。
我们的 new 和 delete 会调用相应的构造函数和析构函数
malloc 和 free 不会调用相应的构造函数和析构函数
class A
{
public:A(int a = 0): _a(a){cout << "A():" << this << endl;}~A(){cout << "~A():" << this << endl;}private:int _a;
};
int main()
{// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数A *p1 = (A *)malloc(sizeof(A));A *p2 = new A(1);free(p1);delete p2;// 内置类型是几乎是一样的int *p3 = (int *)malloc(sizeof(int)); // Cint *p4 = new int;free(p3);delete p4;A *p5 = (A *)malloc(sizeof(A) * 10);A *p6 = new A[10];free(p5);delete[] p6;return 0;
}
operator new 和 operator delete 函数
这两个是实现两个运算符(new 和 delete) 的具体函数,也就是带特殊名称的具体函数
其在实现时是对 malloc 和 free 的封装
两者在调用相应的函数时会进行检测,等遇到空间申请和释放失败的时候会进行抛异常处理,同时也会在空间申请之后调用构造函数,在空间释放之前调用析构函数
// operator new ---------------------------------------------------------
void * __CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{void *p;while ((p = malloc(size)) == 0) // 先尝试 mallocif (_callnewh(size) == 0) // 调用用户安装的 new-handler{static const std::bad_alloc nomem;_RAISE(nomem); // 无 handler 可调用,抛异常}return p;
}// operator delete ------------------------------------------------------
void operator delete(void *pUserData) noexcept
{if (pUserData == nullptr)return;_CrtMemBlockHeader * pHead;RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));_mlock(_HEAP_LOCK);__TRYpHead = pHdr(pUserData); // 取得块头_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));_free_dbg(pUserData, pHead->nBlockUse); // 最终用 _free_dbg → free__FINALLY_munlock(_HEAP_LOCK);__END_TRY_FINALLY
}
new/malloc/delete/free 混用的危害
当我们使用 new 进行自定义数据的数组申请时,如果自定义数据中含有析构函数,则会多申请 4 字节的内存空间来记录相应的数组数据个数 在释放时,会进行相应次数的析构函数调用。
我们在 delete[] 时,会自动便宜释放地址,释放那对申请的 4 字节空间避免内存泄露