动态分配内存

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的区别和联系

C++面试常见问题——02动态分配内存的更多相关文章

  1. Java后台面试 常见问题

    Java后台面试 常见问题   从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米.百度.阿里.京东.新浪.CVTE.乐视家的研发岗offer.我找的是java后台开发,把常见的问题分享 ...

  2. 面试问了解Linux内存管理吗?10张图给你安排的明明白白!

    文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 今天来带大家研究一下Linux内存管理.对于精通 CURD 的业务同学 ...

  3. MySQL索引知识点&面试常见问题

    来源:BiggerBoy 作者:北哥 原文链接:https://mp.weixin.qq.com/s/fucHvdRK5wRrDfBOo6IBGw 大家好我是北哥,今天整理了MySQL索引相关的知识点 ...

  4. 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域

    [源码下载] 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 动态分配内存 链 ...

  5. C++动态分配内存

    动态分配(Dynamic Memory)内存是指在程序运行时(runtime)根据用户输入的需要来分配相应的内存空间. 1.内存分配操作符new 和 new[] Example: (1)给单个元素动态 ...

  6. c/c++动态分配内存和malloc的使用

    c/c++动态分配内存  为什么需要动态分配内存 ---很好的解决的了传统数组的4个缺陷 动态内存分配举例 ---动态数组的构造 使用动态数组的优点:    1. 动态数组长度不需要事先给定: 2. ...

  7. 标C编程笔记day06 动态分配内存、函数指针、可变长度參数

    动态分配内存:头文件 stdlib.h     malloc:分配内存     calloc:分配内存,并清零     realloc:调整已分配的内存块大小     演示样例:         in ...

  8. C&C++动态分配内存(手动分配内存)三种方式

    1. malloc函数 函数原型:void *malloc(unsigned int size)函数的作用是:在内训的动态存储区开辟一个size个字节的连续空间,返回所分配区域的首字节地址. 可以看到 ...

  9. gcc -02引起内存溢出'unsigned i'应修订为'volatile unsigned i'

    2017-12-13 10:44:19gcc -02引起内存溢出'unsigned i'应修订为'volatile unsigned i' 1.3.100 driver/char/random.cst ...

随机推荐

  1. Java-用星号打印菱形

    打印如图所示菱形9行9列(提示可以将菱形分成上下两个三角形,分析每行空格数和星号个数的关系) 代码如下: package com.homework.lhh; public class Ex20 { p ...

  2. nginx_1_初始nginx

    一.nginx简介: nginx是一个性能优秀的web服务器,同时还提供反向代理,负载均衡,邮件代理等功能.是俄罗斯人用C语言开发的开源软件. 二.安装nginx step1:安装依赖库 pcre(支 ...

  3. js读取本地json/txt/xml存在跨越问题,可以用jsonp 读取本地json文件

    想自己用 js写一个原生的ajax请求,访问本地文件,json/txt.但是demo,写了一个后,发现 原来是跨域了. js 写的原生ajax 请求代码如下 html代码 <div id=&qu ...

  4. [Linux] day03——REHL部署

    REHL 部署 Linux 树形目录结构  最顶层 根 / 在Linux中 一切皆文件 文件系统 swap / 安装方式 PXE U盘 光盘 配置安装程序 选择包   5.9    6.4

  5. 学习redis

    https://blog.csdn.net/xiaoyiyz/article/details/60613165 https://bbs.csdn.net/topics/392277304 https: ...

  6. 【快学springboot】10.使用@Async注解创建多线程,自定义线程池

    说明 使用@Async注解创建多线程非常的方便,还可以通过配置,实现线程池.比直接使用线程池简单太多.而且在使用上跟普通方法没什么区别,加上个@Async注解即可实现异步调用. 用法 AsyncTas ...

  7. ASP.NET MVC 4 中Razor 视图中JS无法调试 (重要)

    谷歌浏览器,firefox,IE 都可以 1.首先检查IE中这2个属性是否勾选了. 2.选择IE浏览器进行调试,调试方法有2种 A:采用debugger;的方法,如下图所示: 这时不用调试断点就会在d ...

  8. MyBatisPlus代码生成 mvc项目

    package com.test; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus ...

  9. vue的高级使用技巧

    全局组件注册 一般组件应用弊端,比较笨拙繁琐低效,比如我们写了一些组件,需要引用上的时候就通过import导入,那如果是高频繁需要使用的组件,则需要在每个使用的时候都需要引入并注册 假设现在有两个组件

  10. Java设计模式之Iterator模式

    分类: [java]2013-07-15 10:58 917人阅读 评论(0) 收藏 举报 所谓Iterator模式,即是Iterator为不同的容器提供一个统一的访问方式.本文以java中的容器为例 ...