C++使用动态内存分配的原因解说

上节我们讲了C++程序的内存分布。C++程序的内存分布
本节来介绍为什么要进行内存分配。

按需分配,根据需要分配内存,不浪费。
内存拷贝函数void* memcpy(void* dest, const void* src, size_t n);
从源src中拷贝n字节的内存到dest中。需要包含头文件#include <string.h>

#include <stdio.h>
#include <string.h>

using namespace std;

int main() {
    int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    int* b;
    b = new int[15];

    //从a拷贝10 * 4字节的内存到b
    memcpy_s(b, sizeof(int) * 10, a, sizeof(int) * 10);

    //进行赋值
    for(int i = sizeof(a) / sizeof(a[0]); i < 15; i++){
        *(b + i) = 15;
    }

    for (int i = 0; i < 15; i++) {
        printf("%d ", b[i]);
    }

    return 0;
}

输出结果:

1 2 3 4 5 6 7 8 9 10 15 15 15 15 15

被调用函数之外需要使用被调用函数内部的指针对应的地址空间

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

//定义一个指针函数
void* test() {
    void* a;
    //分配100*4个字节给a指针
    //mallocC语言的动态分配函数
    a = malloc(sizeof(int) * 100);
    if (!a) {
        printf("内存分配失败!");
        return NULL;
    }

    for (int i = 0; i < 100; i++)
    {
        *((int*)a + i) = i;
    }

    return a;
}

int main() {
    //test()返回void*的内存,需要强转换
    int* a = (int*)test();

    //打印前20个
    for (int i = 0; i < 20; i++) {
        printf("%d ", a[i]);
    }

    //C语言的释放内存方法
  free(a);

    return 0;
}

输出结果:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

此处在main函数中使用了在test()函数中分配的动态内存重点地址。

也可以通过二级指针来保存,内存空间:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

//定义一个指针函数
void test(int **a) {

    *a = (int*)malloc(sizeof(int) * 100);
    if (!*a) {
        printf("内存分配失败!");
        exit(0);
    }

    for (int i = 0; i < 100; i++)
    {
        *(*a + i) = i;
    }
}

int main() {
    //test()返回void*的内存,需要强转换
    int* a;
    test(&a);

    //打印前20个
    for (int i = 0; i < 20; i++) {
        printf("%d ", a[i]);
    }

    free(a);

    return 0;
}

突破栈区的限制,可以给程序分配更多的空间。
栈区的大小有限,在Windows系统下,栈区的大小一般为1~2Mb

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

void test() {
    //分配一个特别大的数组
    int a[102400 * 3];// 100k * 3 * 4 = 1200K
    a[0] = 0;
}

int main() {
    test();

    return 0;
}

点运行会出现Stack overflow的提示(栈区溢出!)。
修改:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

void test() {
    //在堆中分配一个特别大的数组1G
    //在Windows 10 系统限制的堆为2G
    int* a = (int*)malloc(1024 * 1000 * 1000 * 1); //1G
    a[0] = 0;
}

int main() {
    test();

    return 0;
}

成功运行!但是当分配两个G的动态内存时,就会报错,这个时候分配失败,a = NULL;

总结:使用堆分三个点。

1、按需分配,根据需要分配内存,不浪费。
2、被调用函数之外需要使用被调用函数内部的指针对应的地址空间。
3、突破栈区的限制,可以给程序分配更多的空间。

本节介绍了为什么使用动态内存分配,下节我们介绍动态内存的分配、使用、释放。

到此这篇关于C++使用动态内存分配的原因解说的文章就介绍到这了,更多相关C++使用动态内存分配内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈C++内存分配及变长数组的动态分配

    第一部分 C++内存分配 一.关于内存 1.内存分配方式 内存分配方式有三种: (1)从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在 例如全局变量,static变量. (2)在栈上创建.在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存 储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. (3) 从堆上分配,亦称动态内存分配.程序在运行的时候用malloc或new申请任意多少的内存,程序员

  • c++ 动态内存分配相关总结

    下面随笔是关于c++动态内存分配. 动态申请内存操作符 new new 类型名T(初始化参数列表) 功能:在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值. 结果值:成功:T类型的指针,指向新分配的内存:失败:抛出异常. 释放内存操作符delete delete 指针p 功能:释放指针p所指向的内存.p必须是new操作的返回值. //例1 动态创建对象举例 #include <iostream> using namespace std; class Point { pub

  • C++动态内存分配(new/new[]和delete/delete[])详解

    C++动态内存分配(new/new[]和delete/delete[])详解 为了解决这个普通的编程问题,在运行时能创建和销毁对象是基本的要求.当然,C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变分配内存的大小,calloc:指针指向内存前初始化),这些函数在运行时从堆中(也称自由内存)分配存储单元,但是运用这些库函数需要计算需要开辟内存的大小,容易出现错误. 那么通常我们在C语言中我们开辟内存的方式如下: (void*)mall

  • C++ 中继承与动态内存分配的详解

    C++ 中继承与动态内存分配的详解 继承是怎样与动态内存分配进行互动的呢?例如,如果基类使用动态内存分配,并重新定义赋值和复制构造函数,这将怎样影响派生类的实现呢?这个问题的答案取决于派生类的属性.如果派生类也使用动态内存分配,那么就需要学习几个新的小技巧.下面来看看这两种情况: 一.派生类不使用new 派生类是否需要为显示定义析构函数,复制构造函数和赋值操作符呢? 不需要! 首先,来看是否需要析构函数,如果没有定义析构函数,编译器将定义一个不执行任何操作的默认构造函数.实际上,派生类的默认构造

  • 详解C++ 动态内存分配与命名空间

    1.C++中的动态内存分配 通过new关键字进行动态内存申请 C++中的动态内存申请时基于类型进行的 delete关键用于内存释放 C语言其实是不支持动态内存分配的,是通过malloc库函数来实现的,可能有一些硬件根本不支持malloc:而C++ new是一个关键字,不管在任意编译器上,任意硬件平台上都是能够进行动态内存分配的,这是本质区别. malloc是基于字节来进行动态内存分配的,new则是基于类型来进行动态内存分配 // 变量申请: Type * pointer = new Type;

  • C++使用动态内存分配的原因解说

    上节我们讲了C++程序的内存分布.C++程序的内存分布 本节来介绍为什么要进行内存分配. 按需分配,根据需要分配内存,不浪费. 内存拷贝函数void* memcpy(void* dest, const void* src, size_t n); 从源src中拷贝n字节的内存到dest中.需要包含头文件#include <string.h> #include <stdio.h> #include <string.h> using namespace std; int ma

  • 动态内存分配导致影响Javascript性能的问题

    内存分配对性能的影响是很大的,分配内存本身需要时间,垃圾回收器回收内存也需要时间,所以应该尽量避免在堆里分配内存.不过直到最近优化HoLa cantk时,我才深刻的体会到内存分配对性能的影响,其中有一个关于arguments的问题挺有意思,写在这里和大家分享一下. 我要做的事情是用webgl实现canvas的2d API(这个话题本身也是挺有意思的,有空我们再讨论),drawImage是一个重要的函数,游戏会频繁的调用它,所以它的性能至关重要.drawImage的参数个数是可变的,它有三种形式:

  • C语言中关于动态内存分配的详解

    目录 一.malloc 与free函数 二.calloc 三.realloc 四.常见的动态内存的错误 [C语言]动态内存分配 本期,我们将讲解malloc.calloc.realloc以及free函数. 这是个动态内存分配函数的头文件都是 <stdlib.h>. c语言中动态分配内存的函数,可能有些初学c语言的人不免要问了:我们为什么要通过函数来实现动态分配内存呢? 首先让我们熟悉一下计算机的内存吧!在计算机的系统中大致有这四个内存区域: 1)栈:在栈里面储存一些我们定义的局部变量以及形参(

  • C语言中动态内存分配malloc、calloc和realloc函数解析

    目录 前言 free函数 malloc函数 calloc函数 realloc函数 扩充 malloc/calloc/realloc区别总结 总结 前言 有时候我们需要的空间大小不确定,需要随着程序需要的空间而变化, 那以数组开辟的固定大小的空间就不适用了, 这时候我们就需要动态分配开辟空间了.当空间不够时就扩容.动态开辟是在堆区开辟一块连续可用空间,并返回这块空间的地址.有三种函数malloc, calloc和realloc.我们动态内存分配就在堆区开辟空间 上面的四个区只有堆区的空间是需要手动

  • c语言详解动态内存分配及常见错误的解决

    目录 为什么会有动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的错误 对NULL指针的解引用操作 越界访问 对非动态内存进行free 使用free释放动态开辟内存的一部分 对同一块动态内存多次释放 对动态内存内存忘记释放(内存泄漏) 为什么会有动态内存分配 内存使用方式有两种 1.创建一个变量 2.创建一个数组 int a = 1; int arr[10]; 但是这两种方式都有一些特点 1.空间是固定大小的,不会变 2.必须提前知道要开辟多少空间,必

  • C语言动态内存分配的详解

    C语言动态内存分配的详解 1.为什么使用动态内存分配 数组在使用的时候可能造成内存浪费,使用动态内存分配可以解决这个问题. 2. malloc和free C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放. (1)void *malloc(size_t size); malloc的参数就是需要分配的内存字节数.malloc分配一块连续的内存.如果操作系统无法向malloc提供更多的内存,malloc就返回一个NULL指针. (2)void free(void *poi

  • C语言 动态内存分配的详解及实例

    1. 动态内存分配的意义 (1)C 语言中的一切操作都是基于内存的. (2)变量和数组都是内存的别名. ①内存分配由编译器在编译期间决定 ②定义数组的时候必须指定数组长度 ③数组长度是在编译期就必须确定的 (3)但是程序运行的过程中,可能需要使用一些额外的内存空间 2. malloc 和 free 函数 (1)malloc 和 free 用于执行动态内存分配的释放 (2)malloc 所分配的是一块连续的内存 (3)malloc 以字节为单位,并且返回值不带任何的类型信息:void* mallo

  • C语言 动态内存分配详解

    C语言 动态内存分配详解 动态内存分配涉及到堆栈的概念:堆栈是两种数据结构.堆栈都是数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除. 栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表. \在C语言中,全局变量分配在内存中的静态存储区,非静态的局部变量(包括形参)是分配在内存的动态存储区,该存储区被

随机推荐