前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++动态内存开辟

C++动态内存开辟

作者头像
code-child
发布2023-05-30 11:17:25
2240
发布2023-05-30 11:17:25
举报
文章被收录于专栏:codechildcodechild

new/delete

new就是在堆区开辟一段空间。 new和c语言中的动态内存开辟不一样——malloc,new是一个操作符 delete就是对申请空间的释放,也是一个操作符。 下面是它的一些写法。

代码语言:javascript
复制
cpp#include<iostream>
using namespace std;
int main()
{
	int* ptr1 = new int;//没有初始化
	int* ptr2 = new int(1);//把申请的内存里面的数据初始化为1
	int* ptr3 = new int[3];//动态申请3个int类型的空间
	int* ptr4 = new int[3]{ 1,2,3 };//动态申请3个int类型的空间,并对相应的空间进行初始化
	return 0;
}

当然也有申请失败的时候,c语言中申请失败返回空指针,c++中会抛出异常。


new和delete会在创建/销毁对象的时候分别调用构造函数,析构函数。这个用malloc不能实现的(成员函数私有的时候,想要实现可以用定位new

代码语言:javascript
复制
cppclass A
{
public:
	A()
	{
		cout << "A()" << endl;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
};
int main()
{
	A* a = new A;
	delete a;
	return 0;
}

注意:

释放的形式要和申请的形式一样

代码语言:javascript
复制
c	A* a = new A;
	delete a;
	A* b = new A[4];
	delete[] b;

当然对于自定义类型也可以初始化,就是在创建类型的后面用小括号或者大括号给予初始的值。

代码语言:javascript
复制
cppclass Date
{
public:
	Date(int year=1)
		:_year(year)
	{
		cout << _year << endl;
	}
private:
	int _year;
};
int main()
{
	Date* a = new Date(2022);
	Date* b = new Date[5]{ 2000,2001,2002,2003,2004 };
	return 0;
}

定位new(对于类)

没有用new进行开辟空间,而是用c语言中的malloc等函数实现的,此时是不会自动调用构造函数的。 定位new的形式 new(申请空间的地址)类型 使用定位new可以解决这个问题。

代码语言:javascript
复制
cppclass A
{
public:
	A(int t=0)
		:x(t)
	{
		cout << "A()" << x << endl;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
private:
	int x;
};
int main()
{
	A* a = (A*)malloc(sizeof(A));
	new(a)A(1);//这样就可以调用构造函数,进行初始化
	a->~A();//要想调用析构函数就这样显式调用
	free(a);//因为不是new申请的,所以不能用delete进行释放,
			//还是用free进行释放
	return 0;
}

关于new/delete的底层

new会调用operator newoperator new最终去调用malloc,只不过在里面实现的时候,没有开辟成功会抛异常罢了。 delete会调用operator deleteoperator delete最终会调用free。 底层代码后期再贴。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-05-26c,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • new/delete
  • 定位new(对于类)
  • 关于new/delete的底层
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档