首页 > 编程语言 >C++ new和delete

C++ new和delete

时间:2023-08-20 16:48:08浏览次数:35  
标签:name data C++ 内存 new pointer delete

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;
}

标签:name,data,C++,内存,new,pointer,delete
From: https://www.cnblogs.com/orzmiku/p/17644211.html

相关文章

  • c++ 丢失笔记 [运算符重载、this指针、复制与拷贝构造、生存周期、箭头操作符]
    运算符重载、this指针、复制与拷贝构造、生存周期、箭头操作符有一部分是学校的OJ里做题需要就提前学了,然后没记笔记,有一部分是笔记丢了。不打算补这些笔记。不过还是在这里mark一下++运算符的重载。因为++运算符可以前置也可以后置,所以这里需要注意一下,如果是后置++,需要一个in......
  • C++ 隐式转换与explicit关键字
    隐式转换与explicit关键字隐式转换函数构造的隐式转换,直接上代码:#include<bits/stdc++.h>classEntity{private: std::stringm_Name; intm_Age;public: Entity(conststd::string&name) :m_Name(name),m_Age(-1){} Entity(intage) :m_Name("Unknown"),m_A......
  • C++ Vector数组优化
    Vector数组优化问题这是一段没有优化的代码:#include<iostream>#include<vector>classEntity{public: intx,y;public: Entity(intx,inty) :x(x),y(y){} Entity(constEntity&e) :x(e.x),y(e.y){ std::cout<<"Copied!"<<st......
  • C++ 智能指针
    智能指针使用智能指针需要引入memory头文件unique_ptr#include<iostream>#include<string>#include<memory>classEntity{public: Entity(){ std::cout<<"CreatedEntity!"<<std::endl; } ~Entity(){ std::cout<<&q......
  • C++ 链接库
    C++中使用库分为两种,静态库和动态库。简单来说,静态库最后会被编译进二进制文件,动态库不会,需要二进制文件从外部载入。以下操作均在VisualStudio2022中进行,以32位GLFW为例子(glfw.org)。首先下载glfw32位的可执行程序。在解决方案目录创建一个Dependencies文件夹(名字无所谓),然后......
  • C++ 创建库并使用
    创建库并使用!>使用VisualStudio2022创建项目和解决方案首先创建一个空项目,这里叫Game,同时VisualStudio会帮你创建解决方案。这个项目是我们的应用程序。创建项目来存库!>以静态库为例、右键解决方案,添加新项目Engine。此时就有了两个项目,Game和Engine:打开E......
  • C++ 类
    类类是一种把数据和功能结合在一起的方法。使用class来定义一个类,像这样:classPlayer{//创建一个Player类intx=0,y=0;intspeed=1;};通过类创建一个对象(实例化),像这样:Playerplayer;成员变量可以使用点(.)来访问对象的属性。player.speed=2;但......
  • C++ 类和结构体内外的Static
    类和结构体外的Static这里的static指的是在类外的static,意味着你要声明的是static的符号,链接将只在内部。(换句话说作用域只在他所在的.cpp文件)。下面是几组例子来理解:例子1:main.cpp#include<iostream>usingnamespacestd;voidfun(){cout<<"fun()inmain.cpp"......
  • C++ 继承
    继承一个类可以继承另一个类,避免了代码复写。被继承的类被叫做基类,继承的类叫做派生类。(或者说是父类和子类)继承类型当一个类派生自基类,该基类可以被继承为public、protected或private几种类型。继承类型是通过上面讲解的访问修饰符access-specifier来指定的。我们几乎......
  • C++ 构造函数与析构函数
    构造函数和析构函数构造函数构造函数会在实例化对象的时候执行,可以在实例化时传入参数。构造函数没有返回值。不需要声明返回值。构造函数的函数名与类名保持一致。//classname:PlayerPlayer(intxa=0,intya=0){//构造函数,传入初始坐标进行初始化......