C语言中malloc/calloc/realloc三者之间的区别?
//三个函数需要包含的头文件一样
#include<malloc.h>
void *malloc( size_t size ); //size 指字节数
void *calloc( size_t num, size_t size ); //num 指元素个数 size 指元素大小
void *realloc( void *memblock, size_t size ); //memblock 指要调整的内存地址 size 指调整后内存空间的大小
函数 malloc 与 calloc 都是用来在堆上申请空间的函数,区别只在于 calloc 在返回所开辟的内存空间的地址之前把每个字节初始化为全0。而 realloc 则是用来调整原空间内存的大小的,它在调整原空间内存大小的基础上还会将原空间的数据搬移到新空间。
注:malloc/calloc/realloc三者开辟的内存空间必须用free函数释放,否则会造成内存泄露。
#include<malloc.h>
void *_alloca( size_t size ); //size 指栈上开辟空间的字节大小
C语言中_alloca函数用于在栈上动态开辟内存,当栈用完退出时,它会自动释放,不需要用户手动释放。
C语言中常见的动态内存错误
一、对NULL指针的解引用操作
二、对动态开辟空间的越界访问
三、对非动态开辟内存使用free释放
四、使用free释放一块动态开辟内存的一部分
五、对同一块动态内存多次释放
六、动态开辟内存忘记释放(内存泄漏)
C++中内存管理的方式
C++既保留了C语言中内存管理方式,也提供了较简便而功能较强的运算符 new 和 delete 进行动态内存管理。
int * p1 = new int; //动态分配单个数据大小为 4个字节(一个 int )的空间
int * p2 = new int(5); //动态分配单个数据大小为 4个字节(一个 int )的空间,并将其初始化为5
int * p3 = new int[3]; //动态分配12个字节(3个 int )的空间
用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL,用户可以根据该指针的值判断分配空间是否成功。
delete运算符使用的一般格式:delete[ ] 指针变量
同样 new 和 delete 一定要匹配使用,否则会出现内存泄露甚至程序崩溃的问题。
delete p1;
delete p2;
delete[] p3; //在指针变量前加一对方括号,表示是对数组空间的操作
既然有 malloc/free 来释放内存空间,为什么C++中还要定义运算符 new/delete ? malloc/free 和 new/delete 的有什么区别和联系?
问题1:为什么要定义 new/delete 呢?我想是因为C++中类的引入,用类定义定义的变量称为对象。而 malloc/free 开辟、释放的都是是内存空间,而对象(非内部数据类型的对象)的创建需要调用类中的构造函数完成内存空间的开辟,对象的释放是在对象被销毁时由编译器自动调用析构函数完成。由此可见 malloc/free 不能完成对象的创建与销毁,因为其不能调用构造函数与析构函数。因此C++中定义了 new/delete。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
问题2 malloc/free 和 new/delete 的区别和联系。
区别:1)malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。
2)C语言程序只能用 malloc/free 管理动态内存。
3)malloc 返回的是 void 指针,new 出来的指针是直接带类型信息的。new可以认为是malloc加构造函数的执行。
联系:1)都用于申请动态内存和释放内存
2)C++程序经常需要调用C语言函数