动态分配内存

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. YUV颜色编码格式

    YUV 颜色编码采用的是 明亮度 和 色度 来指定像素的颜色,而色度又定义了颜色的两个方面:色调和饱和度. 其中: Y 表示明亮度(Luminance.Luma) U 和 V 表示色度(Chromin ...

  2. Java程序员常用工具类库

    有人说当你开始学习Java的时候,你就走上了一条不归路,在Java世界里,包罗万象,从J2SE,J2ME,J2EE三大平台,到J2EE中的13中核心技术,再到Java世界中万紫千红的Framework ...

  3. 输出复选框选中的文件名 checkbox

    1. <tr>        <td><input  type="checkbox" name="cbxFileName"/> ...

  4. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:制作一个小按钮

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. C 语言入门第五章--循环结构和选择结构

    C语言中有三大结构,分别是顺序结构.选择结构和循环结构: 逻辑运算: 与运算: && 或运算:|| 非运算:! ==== #include<stdio.h> int mai ...

  6. SDL 显示汉字

    #include "stdafx.h" #pragma comment(lib,"SDL.lib") #pragma comment(lib,"SDL ...

  7. redis-Hash(哈希表)

    Redis hash 是一个string类型的field和value的映射表,它的添加.删除操作都是O(1)(平均).hash特别适用于存储对象,将一个对象存储在hash类型中会占用更少的内存,并且可 ...

  8. 还是应该立个flag

    6月份 开通博客的想法很简单,就是决定要学习C++和算法,写博客作为督促自己的一个方式,因为还没有系统的学习,自认为写博客或见解有些力所不及,决定先从自己的一篇随笔开始,因为我知道自己一旦开始,就会坚 ...

  9. luogu P2765 魔术球问题

    题目中没有说球的上限是多少,只告诉了柱子,那么我们就应该以柱子为界去增加球,考虑将每两个能组成完全平方数的点连边,就形成了一个DAG(有向无环图),由于是DAG,可以转换为最小覆盖问题,即最多有n条路 ...

  10. JavaScript之this的用法

    本文我们介绍下js中this的用法. 由上图可得,默认this指向window,而在node.js中this默认指向global. 由上图可得: 1.原型链为o->MyClass.prototy ...