(这只是在下的粗浅理解,不足的地方还请谅解,欢迎留言提出,后期理解深入后会加以改进)
C语言使用malloc/calloc/realloc/free进行动态内存管理。
void* malloc(size_t size);
分配长度为size字节的内存块,如果分配成功,返回指向被分配内存的指针,失败则返回NULL;
void* calloc(size_t n,size_ size);
在内存的动态存储区中分配n个长度为size的连续空间,成功返回被分配内存的地址,失败返回NULL;
calloc在分配内存后会自动初始化内存空间为0,而malloc不会初始化
void* realloc(void* p,size_t newsize);
首先会判断当前指针是否有足够大的空间,有则扩大p指向的地址,并返回p,若空间不够,则会重新分配newsize大小的空间,并将原数据全部拷贝到新内存中,然后释放掉原p指向的空间,同时返回新空间的地址
void free(void *ptr);
释放ptr所指向的内存,并将其返回给堆,以便这些内存可以继续使用,否则会造成内存泄漏
free()只能用于由动态地址分配的函数(malloc/calloc/realloc)
new 和 delete 是 C++ 用于管理 堆内存 的
new不会直接的进行内存分配,而是通过调用相应的 operator new(size_t) 函数,动态分配内存
在分配到的动态内存块上 初始化 相应类型的对象(构造函数)并返回其首地址
delete 运算符的内部实现:
delete会调用相应类型的析构函数,处理类内部可能设计的资源释放
在内存释放上会调用相应的operator delete(void *) 函数
new/delete和malloc/free的区别 与 联系
从内存分布的位置上了解
总结:
1、他们都是动态管理内存的入口
2. malloc/free是C/C++标准库的函数,new/delete是C++操作符
3. malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理(清理 成员)
4. malloc/free需要手动计算类型大小且返回值会void*,new/delete可自己计算类型的大小,返回对应类型的指针。
最后一点也是很重要的一点
malloc/free、new/delete、new[]/delete[] 一定匹配使用
否则可能出现内存泄露甚至崩溃的问题