从C到Cpp——四、C++的动态内存管理

一、new运算符

1--

不同于C语言只能用malloc和calloc等库函数来动态分配空间,C++可以new运算符动态分配内存空间。程序员只需要告诉new为哪一种数据结构类型分配空间,new将找到一个内存块,并将返回其地址。当然,这一地址(指针)的数据结构类型是指向所分配数据结构类型的指针。

以下是为int型指针分配空间的示例:

int* p=new int;

分配内存的通用格式是:

typeName* pointer=new typeName;

2--

如果需要使用new运算符创建一个动态数组,比方说建立一个包含20个int元素的数组,可以这样做:

int* parray=new int[20];

熟悉C语言的朋友应该知道,数组名可以被隐式转化为一个指向数组第一个元素的指针。new int[20]表达式返回一个指向int的指针,也就是int*类型变量。所以上述这个式子就非常合理了。

二、delete运算符

1--

C语言用free()函数释放内存,而C++中可以使用delete运算符释放内存。示例如下:

int* p=new int;
cin>>p;
cout<<p;
delete p;

delete p;将释放p指向的内存,但不会删除p指针本身。而是找到p所指的地址,并释放。

2--

对于new创建的动态数组,用如下的表达式释放

delete [] parray;

3--

和malloc作用的效果一样,得到的指针p虽然被分配了空间,但仍然是一个指针,仍然可以进行指针运算,如下:

#include <iostream>
using namespace std;

int main(void)
{
	int* p;
	p=new int[20];
	p[0]=0;
	p[1]=1;
	p++;
	cout<<*p; 
}

输出结果是1,说明成功进行了指针运算。

三、new运算符和初始化

new运算符如果只有和malloc和calloc一样的功能,那就太乏善可陈了!

事实上,new运算符支持对单个变量、数组初始化操作,具体而言如下

1--对单个变量初始化

做法是在后面加上一对圆括号(),圆括号中是需要初始化的值,示例如下:

#include <iostream>

int main(void)
{
	int* a=new int(3);
	std::cout<<(*a);
} 
//输出结果为3

2--对数组进行初始化

做法是后面加上一对花括号{},花括号中是用逗号(,)分割的初始化的值。用花括号是符合C语言习惯的,C语言对数组进行初始化,用的也是{}。具体示例如下:

#include <iostream>

int main(void)
{
	int* a=new int[5]{1,2,3,4,5};
	std::cout<<(a[4]);
} 
//输出结果为5

有趣的是,在C++11标准中,使用{}的初始化也适用于单个变量:
 

#include <iostream>

int main(void)
{
	int* a=new int{3};
	std::cout<<*a;
} 
//输出结果为3
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值