动态内存申请与释放:
new和malloc的功能:
malloc是从堆空间申请指定数额的内存空间给当前进程。
new在malloc的基础上,申请内存空间后调用对象的构造函数。
free和delete的功能:
free是将当前进程中从堆空间申请的内存中不需要的部分退还给堆空间,称为释放内存从进程释放到堆空间。
delete是在用free释放当前对象之前,调用该类的析构函数。
这四个关键字都需要和指针变量结合使用,需要有一个指针变量来指向被申请或被释放的内存。
动态分配内存的过程中,需要在栈空间申请一个四字节内存空间用于存放指针变量名等信息,通过指针变量申请、访问、释放堆中内存,故指针变量本身占用的是栈空间,其指向的内存占用的是堆空间。
函数中创建一个指针,此时该指针已经在栈空间中分配了大小为4字节的内存,但该指针不会自动指向Null,其值是随机的,是个野指针。
new和malloc申请的内存通过赋值号将其申请空间的首地址赋值给指针变量,将该指针初始化为正常的可用指针,此时该指针在栈空间占用4字节,在堆空间占用相应对象类型大小的内存空间。
free和delete将该指针指向的堆空间的内存释放掉,返还给堆空间,但该指针本身在栈空间中仍然存在且仍然指向堆空间中已经被释放的内存的地址,此时的指针就是“野指针”,为了避免在函数体后面的代码中因大意而调用野指针导致报错崩溃,需要将指针在释放掉堆空间之后立刻让其指向NULL或nullptr,然后等待其生命周期结束后被栈空间回收即可。
倘若被分配了堆空间内存的指针在释放内存之前生命周期就完结了,那么该指针在栈空间上就会被回收,但其堆空间上释放的内存仍然不会被释放,而由于指针本身已经被回收,该进程便失去了对原指针所指的堆空间的内存的访问能力,该部分内存空间存在与进程却无法访问或释放,便是内存泄露,直到程序运行终止,进程所有内存均被操作系统回收。
动态内存申请与释放:new和malloc的功能:malloc是从堆空间申请指定数额的内存空间给当前进程。new在malloc的基础上,申请内存空间后调用对象的构造函数。free和delete的功能:free是将当前进程中从堆空间申请的内存中不需要的部分退还给堆空间,称为释放内存从进程释放到堆空间。delete是在用free释放当前对象之前,调用该类的析构函数。这四个关键字都需要和指针变量结合使用,需要有一个指针变量来指向被申请或被释放的内存。动态分配内存的过程中,需要在栈空间申请一个四字节内
一般来说,在C/
C++
的面试时,对于
new
/
delete
和
malloc
/
free
这两对的使用和区别经常被考查到,如果这种基础的问题都答不上来,估计很难过面试了。本文即是对
new
/
delete
和
malloc
/
free
这两对的使用和区别较为简单的分析一下,供大家参考。
一、
new
和
delete
new
和
delete
是
C++
的运算符,用于动态分配内存和
释放
内存。
1.
new
表达式
标准库定义了operator
new
函数的几个重载版本,没有使用noexcept说明的版本在内存分配失败时可能会抛出bad_alloc异常,而使用了的不会抛出异常。
void* operator
new
( size_t
文章目录前言一、动态分配内存概述二、静态分配、动态分配2.1静态分配2.2动态分布三、动态分配函数3.1
malloc
3.2
free
3.3 calloc3.4 realloc四、内存泄漏总结
本篇主要记录
动态内存
一些相关知识。
学习笔记,如有错误,还请指正。
码字不易,还请各位多多点赞收藏关注,感谢各位。
一、动态分配内存概述
在数组一文中,介绍过数组的长度是预先定义好的,在整个程序中固定不变,但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定 。为了解
突然发现自己接手的C项目里,有许多
New
申请
的空间,却用
Free
来
释放
内存。查到两篇写得不错得博客,先收藏此处,以后找时间自己总结一下。
C++
中
new
申请
的内存, 可以用
free
释放
吗?
浅谈
C++
中的
new
/
delete
和
new
[]/
delete
[]
这里写目录标题
malloc
/
free
典型用法内存分配实现过程
new
/
delete
典型用法内存分配实现过程
new
/
delete
和
malloc
/
free
的区别
malloc
/
free
malloc
()负责动态配置内存,大小由size决定,返回值成功时为任意类型指针,失败时为NULL。
void *
malloc
(size_t size)
free
()负责
释放
动态
申请
的内存空间,调用
free
( )后ptr所指向的内存空间被收回,如果ptr指向未知地方或者指向的空间已被收回,则会发生不可预知的错误,如果
在C语言中使用
malloc
和
free
来分配和
释放
内存空间。
在
C++
中提供了更简单且
功能
强大的运算符
new
和
delete
来取代
malloc
和
free
函数。
new
和
delete
是运算符,不是函数,因此执行效率高。
在
C++
中建议使用
new
和
delete
。
二.
malloc
和
free
使用
//
申请
空间
int* a = (int*)
malloc
(sizeof(int));
//
申请
10个int空间
int* b = (int*)
malloc
(sizeof(int)*10);
new
/
delete
和
malloc
/
free
都是用来动态分配和
释放
内存的。
malloc
/
free
是C语言中的函数,在
C++
中也可以使用。而
new
/
delete
是
C++
中与类相关的运算符,只能用于对象和数组的分配和
释放
。
关于区别,主要有以下几点:
1. 内存分配方式不同。
malloc
/
free
是函数,使用时需要指定要分配的字节数,并返回指向分配内存的指针。
new
/
delete
是运算符,使用时需要指定要分配的对象类型,会自动计算需要分配的空间大小。
2. 内存对齐方式不同。
malloc
函数分配的内存空间未必按照对象的对齐方式分配,可能需要手动对齐。而
new
运算符会自动按照对象的对齐方式分配内存空间。
3. 内存
释放
方式不同。
malloc
函数分配的内存需要使用
free
函数进行
释放
;
new
运算符分配的内存需要使用
delete
运算符进行
释放
。
4. 构造函数和析构函数的调用。在使用
new
运算符分配内存空间时,会自动调用对象的构造函数来初始化对象;在使用
delete
运算符
释放
内存空间时,会自动调用对象的析构函数来进行清理工作。而使用
malloc
和
free
函数则需要手动调用构造函数和析构函数。