C++学习——动态内存分配

简介: C++学习——动态内存分配

何为静态内存分配?


通常定义变量(或对象),编译器在编译时可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候事先为他们分配确定的存储空间。这种内存分配称为静态存储分配;


这种内存分配的方法存在比较严重的缺陷。


为什么需要动态内存分配


在使用数组的时候(线性拟合),总有一个问题困扰着我们:数组应该有多大?在很多的情况下,你并不能事先确定数组的大小。


定义大了:空间浪费


定义小了:不够用,可能引起下标越界错误,


即使正好:如果因为某种特殊原因空间利用的大小有增加或者减少(增加点或减少点),你又必须重新去修改程序,扩大数组的存储范围。


解决方法:动态内存分配


C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区(stack),动态存储区,(堆heap区或自由存储区free store)。


动态内存分配技术可以保证 程序在运行过程中,按照实际需要申请适量的内存,使用结束后还可以释放;


这种在程序运行过程中申请和释放的的存储单元也称为堆对象,申请和释放的过程一般称为建立(New)和删除(delete)。


所有动态存储分配都在堆区中进行。


动态申请内存操作符 new


new 类型名T(初始化参数列表)


功能:在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值。

结果


成功:T类型的指针,指向新分配的内存并返回该内存区域的首地址;


失败:抛出异常。


释放内存操作符delete


delete 指针名p


**功能:**释放指针p所指向的内存。


p必须是new操作的返回值。


注意问题


初始化问题


标准数据类型:


       int *point; 
       point=new int(2);


C++比C中多了类的概念,


建立对象时,要调用类的构造函数;


删除对象时,要调用类的析构函数。


内存泄露问题


用new分配的内存,必须要用delete释放!


否则,会导致分配的内存无法收回,使得程序占据的内存越来越大。


用new分配的内存,能且仅能用一次delete释放


内存泄露举例


下例中delete p; 是错误的 ,要用delete []p才行

int * p = new int[88]; 
delete p;  //这里就内存泄露了,要用delete []p才行
int function(int num)
{
         int *p = new[44];
         if( num > 111)
             return 0;
          delete []p;   
    return 1;
}


申请和释放动态数组


分配:new 类型名T [数组长度 ]


数组长度可以是任何表达式,在运行时计算


释放:delete [] 数组名p


释放指针p所指向的数组。


p必须是用new分配得到的数组首地址。


动态创建多维数组


new 类型名T[第1维长度][第2维长度]…;


如果内存申请成功,new运算返回一个指向新分配内存首地址的指针,是一个T类型的数组,数组元素的个数为除最左边一维外各维下标表达式的乘积。


错误示例:


例如:动态创建一个2行3列的动态数组:

char  *fp;
fp = new char[2][3];


正确实例:


char (*fp)[3];
fp = new char[2][3];


动态生成二维数组还可以这样子


int **a = new int*[n];
    for(int i = 0; i < n; i++)
        a[i] = new int[m];
相关文章
|
22天前
|
C++
c++的学习之路:27、红黑树
c++的学习之路:27、红黑树
31 4
|
5天前
|
存储 编译器 C语言
C++中的内存管理
C++中的内存管理
17 0
|
5天前
|
编译器 C++
【C++】继续学习 string类 吧
首先不得不说的是由于历史原因,string的接口多达130多个,简直冗杂… 所以学习过程中,我们只需要选取常用的,好用的来进行使用即可(有种垃圾堆里翻美食的感觉)
7 1
|
5天前
|
算法 安全 程序员
【C++】STL学习之旅——初识STL,认识string类
现在我正式开始学习STL,这让我期待好久了,一想到不用手撕链表,手搓堆栈,心里非常爽
13 0
|
5天前
|
存储 安全 测试技术
【C++】string学习 — 手搓string类项目
C++ 的 string 类是 C++ 标准库中提供的一个用于处理字符串的类。它在 C++ 的历史中扮演了重要的角色,为字符串处理提供了更加方便、高效的方法。
15 0
【C++】string学习 — 手搓string类项目
|
6天前
|
存储 Linux C语言
【C++从练气到飞升】07---内存管理
【C++从练气到飞升】07---内存管理
|
8天前
|
存储 编译器 C++
【C++】内存管理和模板基础(new、delete、类及函数模板)
【C++】内存管理和模板基础(new、delete、类及函数模板)
22 1
|
15天前
|
编译器 C语言 C++
【C++入门学习指南】:函数重载提升代码清晰度与灵活性
【C++入门学习指南】:函数重载提升代码清晰度与灵活性
23 0
|
20天前
|
存储 缓存 算法
C++从入门到精通:4.6性能优化——深入理解算法与内存优化
C++从入门到精通:4.6性能优化——深入理解算法与内存优化
|
20天前
|
存储 程序员 编译器
C++从入门到精通:3.4深入理解内存管理机制
C++从入门到精通:3.4深入理解内存管理机制