【C/C++】动态内存管理

        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语言中内存管理方式,C++中提供了较简便而功能较强的运算符 newdelete 进行动态内存管理。(因为)

       new运算符使用的一般格式: new 类型 [初值]

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;  //在指针变量前加一对方括号,表示是对数组空间的操作

       

猜你喜欢

转载自blog.csdn.net/xiayzn/article/details/80748391
今日推荐