C++new关键字

定义

new关键字主要目的是在堆上分配内存。

用法:new + 数据类型(类、基本类型、数组),数据类型决定了必要的分配大小,以字节为单位。
new int :它需要4个字节的内存,会分配给4个字节的内存,一旦它有了它要处理的数字,它就会询问你的操作系统,需要四个字节的内存,因此需要找到一个包含四个字节内存的连续块,并且在一行内存中找到4个字节的地址空间,一旦找到后,它会返回一个指向这个内存的指针,然后就可以使用你的数据,并在那里存储数据并进行读写访问
寻找连续内存的方法:有一种叫做空闲列表的东西,它会维护那些有空闲字节的地址(比较慢),仍是主要的方法。

总的来说:new就是找到一个足够大的内存块,以满足我们的需求,然后他给我们一个指向那块内存的指针,并且在使用new关键字时,你必须要使用delete释放内存。

代码案例:

# include <iostream>
using namespace std;

class Entity
{
private:
	string m_Name;
public:
	Entity() : m_Name("Unknown") {}
	Entity(const string& name) : m_Name(name) {}

	const string& GetName() const { return m_Name; }

};

int main()
{
	int a = 3;
	int* b = new int; 
	int* c = new int[50]; 
	Entity* entity = new Entity();

	// 通常调用new,会调用隐藏在里面的c函数malloc(),它代表内存分配,它的实际作用是传入一个size(也就是需要多少字节),然后返回一个void指针
	Entity* e1 = (Entity*)malloc(sizeof(Entity)); 
	Entity* e = new Entity[50]; // 分配一个Entity数组,用[],会在内存中连续得到50个Entity
	
	// 使用new关键字时,你必须要用delete
	//free(e);//调用C函数free,free可以释放malloc申请的内存
	delete e1, b;
	delete entity;
	// 由于c和e是使用了数字操作符来分配的,new包含数组操作符和之前没有的时候是有区别的,使用delete[]
	delete[] e;
	delete[] c;
	// delete也是一个操作符,有block内存块和size作为参数
	cin.get();
	return 0;
}

int* b = new int; new返回的是指向你分配内存的指针,即一个单一的4字节,在堆上分配,b存储的是它的内存地址

int* c = new int[50]; 分配一个数组,就加上方括号,需要200字节的内存(50*4)

Entity* entity = new Entity(); 在堆上分配Entity类,不仅要在堆上分配足够的内存来存储这个Entity,同时也调用构造函数

Entity* e = new Entity[50]; 分配一个Entity数组,用[],会在内存中连续得到50个Entity,例子中的每个Entity并不是真的在另一个内存地址,你有你的内存块,它是50个内存块,刚好是一排

new是一个操作符,就像加、减、等于一样,它是操作符,意味着你可以重载这个操作符,并改变它的行为。

空指针是一个没有类型的指针,指针只是一个内存地址,指针之所以需要类型,是因为你需要类型来操控它。

通常调用new,会调用隐藏在里面的c函数malloc(),它代表内存分配,它的实际作用是传入一个size(也就是需要多少字节),然后返回一个void指针 

Entity* e1 = (Entity*)malloc(sizeof(Entity)); // 将其类型转换称Entity*类型,将C中的用法用到了C++上。
//与Entity* entity = new Entity();等价
//区别在于new关键字创建的不仅返回了内存指针,而且还调用了构造函数
//而Entity* e = (Entity*)malloc(sizeof(Entity));仅仅分配内存,然后给我们一个指向那个内存的指针,没有构造函数

使用delete释放内存

使用new关键字必须使用delete释放内存 

int* c = new int[50];
Entity* e = new Entity[50];

由于c和e是使用了数字操作符来分配的,new包含数组操作符和之前没有的时候是有区别的,使用delete[]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值