C++ new和delete

发布时间 2023-08-20 16:37:36作者: OrzMiku

new关键字

在C++中,当我们在函数内声明一个变量时,变量会被放在栈(stack)中。栈中的内存离开代码块就被释放了。而且栈的内存很小,当我们声明了大量变量可能会导致内存不足。

内存除了栈以外,还有堆(heap),当我们在函数外声明一个全局变量时,这个变量就放在堆上。堆是程序未使用的内存,可以被动态分配。当我们在堆上申请空间时,申请到的空间并不会自动释放,而是需要我们去手动释放内存。

new关键字就可以为任意数据类型动态分配内存空间。

data-type* pointer = new data-type;
data-type* pointer = new data-type[N]; // 数组

在c++中我们依然可以使用malloc来动态分配内存空间,但是不推荐这样做。我会在后面的代码例子中体现出来。

new申请到的空间不再使用时,需要用delete关键字释放内存。

delete pointer; // pointer是指向new申请的内存
delete [] pointer; // 删除数组

例子:

#include<iostream>

class Entity {
private:
	std::string m_name;
public:
	Entity():m_name("Unknowen") {}
	Entity(std::string name) :m_name(name) {}
	void printName() {
		std::cout << m_name << std::endl;
	};
};

int main() {
	int a = 2; // 没有使用new
	int* b = new int[20]; // 使用new在堆上分配空间(这里分配了80个字节)
	Entity e("OrzMiku"); // 没有使用new
	/*
		下面这俩是有区别的
		e1有初始化,调用了默认的构造函数
		e2只是分配了对应大小的内存,没有做任何事情
	*/
	Entity* e1 = new Entity;
	Entity* e2 = (Entity*)malloc(sizeof(Entity));
	e1->printName();
	e.printName();
	delete e1; // new 申请空间记得用delete释放
	delete[] b;
	free(e2); // malloc 申请空间记得用free释放
	return 0;
}