EasyC++,存储方案和动态分配

存储 存储软件
我们在之前的文章当中也曾介绍过,动态内存由new和delete控制,而不是由作用域和链接性规则控制。所以我们可以在一个函数当中分配动态内存,在另外一个函数中释放。

 

大家好,我是梁唐。

想要追求更好阅读体验的同学,可以点击「阅读原文」访问github仓库。

存储方案和动态分配

在之前的文章当中,我们讨论了C++用来为变量分配内存的5种方案,但是这些方案并不适用于使用new运算符分配的内存,这种内存被称为动态内存。

我们在之前的文章当中也曾介绍过,动态内存由new和delete控制,而不是由作用域和链接性规则控制。所以我们可以在一个函数当中分配动态内存,在另外一个函数中释放。

通常C++编译器当中有三块独立的内存,一块用于静态变量,一块用于自动变量,还有一块用于动态存储。

虽然存储方案的概念不适用于动态内存,但是适用于动态内存的自动和静态指针。C++ Primer当中有这么一个例子,我们在一个函数当中有如下语句:

  1. float * p_fees = new float[20]; 

很明显,我们通过new创建了一个长度为20的float数组,这块数组的内存将会一直停留在内存当中,直到使用delete语句释放。但当该函数运行结束的时候,p_fees这个指针将会消失。如果希望在其他地方能够使用这个数组,需要将地址通过某种方式返回或者传递。

如果我们将p_fees的链接性声明为外部的,那么我们在其他地方都可以访问到了,如果另外的文件当中需要访问,也同样可以使用关键字extern。

初始化

前面讲了使用new申请内存的方法,如果我们想要在分配内存的同时完成变量的初始化,应该怎么办呢?

如果要为内置的标量类型分配空间并初始化,可以在类型名后面加上初始值,并将它用括号括起来:

  1. int *pi = new int(3); 
  2.  
  3. double *pd = new double(99.9); 

如果我们要初始化结构体或者是数组,则需要使用大括号的列表初始化,这需要编译器支持C++11,这是C++11中的新特性:

  1. struct P { 
  2.     int x, y; 
  3. }; 
  4.  
  5. P *p = new P{3, 4}; 
  6. int *arr = new int[4] {2, 3, 4, 5}; 

在C++11当中也支持对单值变量使用列表初始化:

  1. double *pd = new double(99.99); 

 本文转载自微信公众号「Coder梁」,可以通过以下二维码关注。转载本文请联系Coder梁公众号。

 

责任编辑:武晓燕 来源: Coder梁
相关推荐

2022-01-07 15:10:53

C++动态内存

2021-12-30 14:58:58

C++函数动态

2021-12-12 18:13:54

C++This指针

2021-11-09 10:38:16

C++Const指针

2021-12-29 20:31:40

C++多态指针

2021-11-26 10:56:28

C++存储持续性

2021-12-09 10:56:50

函数C++原型

2021-11-26 00:03:20

C++编译常量

2021-11-30 11:04:36

C++函数语言

2021-12-08 10:43:09

C++实现

2021-12-10 10:45:36

C++函数Stock

2021-10-26 00:19:51

C++结构体存储

2021-11-27 11:50:09

C++静态持续

2021-12-11 19:02:03

函数C++对象

2021-12-03 10:48:18

Using编译指令

2021-11-10 10:48:36

C++函数指针

2021-12-15 10:25:57

C++运算符重载

2022-01-04 16:35:42

C++Protected关键字

2021-12-05 18:20:42

C++空间特性

2021-10-26 15:36:17

C++枚举值类型
点赞
收藏

51CTO技术栈公众号