【C++】动态内存 new和delete的简单运用和理解

我们在使用C语言时,通常使用malloc函数来开辟空间,在C++中,我们通常不这么做(当然,这么做仍旧是可以的)。
在C++中,我们通常使用new来开辟动态空间。

int* a = new int;

比如我们想要开辟一个四字节整形数据的堆空间,就可以这样,new后边跟你的数据类型。

这样写相较于malloc而言,要更加方便快速。

同样的,当我们需要释放这篇空间时,需要用到delete

delete a;

new delete是操作符,malloc和free是函数,这是他们的不同。

但实际上,new delete的底层还是依赖于malloc和free来实现功能的。
在这里插入图片描述
我们通过debug进入到反汇编中进行观察,发现new和delete实际上也是调用了相关的函数来完成动态开辟的。
而这函数其内部也是调用了malloc和free函数。

当你的new开辟空间失败的时候,不会返回空指针,而是直接报错。

那我们要new一个数组呢?

	int* a = new int[10];
	//还可以对其进行初始化
	int *b=new int[3]{1,2,3};

最后释放其空间

	delete[]a;//切记,一定要注意这个[]

这是数组空间的开辟和释放的方法。

我们知道我们在C++中可以自定义类
而new和delete与malloc和free最大的不同是,new会同时调用构造函数,delete会同时调用析构函数。

我们简单的定义这样一个类

class A
{
public:
	A()
		:_a(0)
	{
		cout << "构造" << endl;
	}
	~A()
	{
		cout << "析构" << endl;
	}
private:
	int _a;
};

new一个数组

int main()
{
	A* pa = new A[10];
	delete[]pa;
	return 0;
}

在这里插入图片描述
运行之后,我们可以发现,调用了十次构造函数以及十次析构函数。

我们对类做出调整,再次实验。

class A
{
public:
	A()
		:_a(0)
	{
		cout << "构造--" <<this<<endl;
	}
	~A()
	{
		cout << "析构--" <<this<< endl;
	}
private:
	int _a;
};


int main()
{
	A* pa = new A[10];
	cout << endl;
	delete[]pa;
	return 0;
}

在这里插入图片描述
我们可以看到,最先构造的最后析构,最后构造的,最先析构。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值