动态分配内存

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;
  1. 二维数组的动态内存分配

    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分配失败时会抛出异常。

参考链接:

  1. 菜鸟教程——C++动态内存
  2. malloc/free和new/delete的区别和联系

最新文章

  1. 烂泥:Postfix邮件服务器搭建之软件安装与配置
  2. javascript学习之运动框架
  3. -/bin/sh: ./led: not found的解决办法
  4. Java开发之文件上传
  5. spring security之httpSecurity使用示例
  6. PostgreSQL wiki
  7. Linux-Gcc生成和使用静态库和动态库详解
  8. Android中空格及换行
  9. Javascript实现Web颜色值转换
  10. Linux搭建FTP
  11. 使用Heartbeat实现双机热备
  12. nopCommerce 3.9 大波浪系列 之 global.asax
  13. 通俗理解ZooKeeper是如何保证数据一致性的
  14. file上传图片,base64转换、压缩图片、预览图片、将图片旋转到正确的角度
  15. PAT乙级题:1003我要通过!
  16. excel追加数据
  17. 【转】java基本数据类型vs封装数据类型
  18. FFmpeg在Android上的移植优化步骤
  19. 改善C#程序的建议4:C#中标准Dispose模式的实现
  20. Linux常用软件安装

热门文章

  1. text-align:center;在ie7下,父级加上会让block状态的子元素居中。
  2. 6(计算机网络) 交换机与VLAN
  3. Django 学习之中间件Middleware
  4. 【快学springboot】9.使用 @Transactional 注解配置事务管理
  5. JMeter配置JDBC测试SQL Server/MySQL/ORACLE
  6. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:为按钮添加基本样式
  7. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:设置元素为 display:block 并居中显示
  8. 【剑指Offer面试编程题】题目1503:二叉搜索树与双向链表--九度OJ
  9. SDL 显示汉字
  10. linux 串口 拼帧处理