C++面试常见问题——02动态分配内存
2024-10-08 16:33:26
动态分配内存
C++动态内存
C++程序中内存分为两个部分
- 堆:程序中未使用的内存,在程序运行时可用于动态分配内存。
- 栈:函数内部申明的所有变量都将占用栈内存。
很多时候不知道一个程序到底需要多少内存,可以在程序运行时使用关键字new动态分配内存,这会返回所分配的空间地址。当不在需要分配的内存时可以使用delete进行删除。
动态内存分配方式
1. new与delete
用法:
类型名 *指针变量 = new 类型名;
类型名 *指针变量 = new 类型名[元素个数];
int *p = new int; //指向int型的指针
int *pArr = new int[len]
使用new时自由存储区可能已经被用完,因此最好检查是否分配成功。
int *p = NULL;
if( !(p = new int) ){
cout<<"ERROR"<<endl;
exit(1);
}
delete的用法
delete p;
delete []pArr; //删除内存块后强烈建议将指针指向NULL,避免其成为野指针。
pArr = NULL;
二维数组的动态内存分配
int **array;
//假设维度为m x n
array = new int *[m];
for(int i = 0; i < m;i++){
array[i] = new int array[n];
}
//删除
for(int i = 0;i < m;i++){
delete []array[i];
}
delete []array;
2.对象的二动态内存分配
#include<iostream>
using namespace std;
class Box{
public:
Box(){
cout<<"构"<<endl;
}
~Box(){
cout<<"析"<<endl;
} };
int main(){
Box* b = new Box[5]; //构构构构构
delete []b; //析析析析析
return 0;
}
2. malloc与free
malloc是编译器的内置函数,包含于头文件stdlib.h。
//malloc原型
void malloc(unsigned in size)
//free原型
void free(void* p)
//malloc用法
int *p = (int*)malloc(sizeof(int)*len);
for(int i= 0;i < len;i++){
cin>>*p;
}
//free用法
free(p);
- 使用new关键字时不仅开辟了内存,还创建了对象,特别是对类使用时自动调用构造函数,delete时自动调用析构函数。而malloc对类使用时只会开辟内存空间,不会对类自动进行初始化,free时也不会清理成员函数的
- malloc&free是标准库函数,new&delete是C++关键字。
- malloc&free需要手动计算大小,返回值为void*。new&delete自动计算类型的大小,返回对应类型的指针。
- malloc&free分配内存失败会返回0。new&delete分配失败时会抛出异常。
参考链接:
最新文章
- 烂泥:Postfix邮件服务器搭建之软件安装与配置
- javascript学习之运动框架
- -/bin/sh: ./led: not found的解决办法
- Java开发之文件上传
- spring security之httpSecurity使用示例
- PostgreSQL wiki
- Linux-Gcc生成和使用静态库和动态库详解
- Android中空格及换行
- Javascript实现Web颜色值转换
- Linux搭建FTP
- 使用Heartbeat实现双机热备
- nopCommerce 3.9 大波浪系列 之 global.asax
- 通俗理解ZooKeeper是如何保证数据一致性的
- file上传图片,base64转换、压缩图片、预览图片、将图片旋转到正确的角度
- PAT乙级题:1003我要通过!
- excel追加数据
- 【转】java基本数据类型vs封装数据类型
- FFmpeg在Android上的移植优化步骤
- 改善C#程序的建议4:C#中标准Dispose模式的实现
- Linux常用软件安装
热门文章
- text-align:center;在ie7下,父级加上会让block状态的子元素居中。
- 6(计算机网络) 交换机与VLAN
- Django 学习之中间件Middleware
- 【快学springboot】9.使用 @Transactional 注解配置事务管理
- JMeter配置JDBC测试SQL Server/MySQL/ORACLE
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:为按钮添加基本样式
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:设置元素为 display:block 并居中显示
- 【剑指Offer面试编程题】题目1503:二叉搜索树与双向链表--九度OJ
- SDL 显示汉字
- linux 串口 拼帧处理