c++ 读书笔记(三)

new 与delete

分配内存与释放内存

new分配的内存块通常与常规变量声明分配的内存块不同。变量的值都存储在被称为栈的内存区域。而new从被称为堆或自由存储区的内存区域分配内存。
例如:

int *ps=new int;
delete ps;

只能用delete来释放使用new分配的内存,然而,对空指针使用delete是安全的

动态数组

int *psome=new int[20];
delete [] psome;

不要使用delete来释放不是new的内存
不要使用delete释放同一个内存块两次

自动存储,静态存储和动态存储

自动存储

在函数内部定义的常规变量使用自动存储空间,被称为自动变量。这种变量在所属的函数被调用时自动产生,在该函数结束时消亡。
实际上,自动变量是一个局部变量,其作用域为包含它的代码块。代码块是被包含在花括号的一段代码,到目前为止,我们使用的所有代码块都是整个函数。
自动变量通常存储在栈中。这意味着执行代码时,其中的变量将以此加入到栈中,而在离开代码块时,将按相反的顺序释放这些变量,这被称为后进先出,因此,在程序执行过程中,栈将不断地增大和缩小。

静态存储

静态存储是整个程序执行期间都存在的存储方式。使变量称为静态的方式有两种,一种是在函数外面定义它。另一种是在声明变量时使用关键字static;

动态存储

new和delete运算符提供了一种比自动变量和静态变量更灵活的方法。他们管理了一个内存池,这在c++中被称为自由存储空间或堆。该内存池同用于静态变量和自动变量的内存是分开的。它数据的声明周期完全不受程序或函数的生存时间控制。

可替代数组的类–>模板类

vector

模板类vector类似于string类,也是一种动态数组。可在运行阶段设置vector对象的长度
要是用vector,要包含头文件 vector,并且在名字空间std中

声明: vector <typenName> vt(n_elem);

#include <vector>
using namespace std;
vector<int> v1;	//创建一个大小为0的整型数组
int n;
cin>>n;
vector<double> vd(n);	//创建一个大小为n的double对象

与数组相比,效率稍低

array

与数组一样,array对象的长度也是固定的。也使用栈,而不是自由存储区。效率与数组相同,但更方便,安全。

声明: array<typeName,n_elem> arr;

#include <array>
using namespace std;
array<int,5> ai;
array<double,4> ad={1.2.2.1,4.5,6.3};

无论是数组,vector,array都可使用标准数组表示法来访问各个元素。
数组和array存储在相同的内存区域,即栈中;而vector对象存储在自由存储区或堆中;
可以将一个array对象赋给另一个array对象,对于数组,必须逐元素复制数据。

ai[-2] =20;	//越界了,但是不会被检查出来
可使用成员函数at():
ai.at(1)=2;
中括号表示法和成员函数at()的差别在于,使用at()时,将在运行期间捕获非法索引,而程序默认将中断。
这种额外检查的代价是运行时间长
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值