当前位置:首页 » 《休闲阅读》 » 正文

【C++】new用法详解

8 人参与  2024年03月22日 17:12  分类 : 《休闲阅读》  评论

点击全文阅读


目录

一.什么是new(What)

二.使用new的场景(When and Where)

三.如何使用new(How)


一.什么是new(What)

1.new是一个关键字,用于开辟空间,开辟的空间在上,而一般声明的变量存放在栈上;

2.new得到的是一段空间的首地址。所以一般需要用指针来存放这段地址

new int(10);//返回new出来这块内存的地址int *p=new int(10);//用一个指针去接受这个地址cout << p << endl;//返回内存空间地址00995B08cout << *p << endl;//返回初始值10delete p;

3.开辟的内存空间需要记得delete掉,否则会造成内存泄漏!

delete p的时候:首先调用这个对象的析构函数,然后释放这个对象的空间。

二.使用new的场景(When and Where)

C++ 中的存储方法大致有:

静态存储:声明变量的时候前面添加static关键字;

自动存储: 这个举个例子,在一个函数A里面定义了一个变量并初始化, int a =10 ; 这个就是自动存储,

a仅当A()函数活动时存在。当成许控制权回到main()时,a使用的内存将自动被释放,

动态存储:数据的声明周期不完全受程序或函数的生命时间控制 ,所以C++ 中有new 来分配空间,不过由于内存不会自动释放,所以使用完之后还需要使用delete 来释放内存。

所以new是为了动态内存分配而服务的。


不适用的场合:

频繁调用场合不适合用new,new会频繁申请和释放内存。


常见的使用场景如下:

1.为变量动态分配内存,包括基本数据类型变量int、double;一维数组;二维数组;

2.为类对象动态分配内存,也可以为结构体分配内存(类和结构体类似);

三.如何使用new(How)

1.动态创建一个类对象

获得一块堆内存空间;调用构造函数;返回正确的指针。

有一个类class Car,构造函数是Car(),创建一个该类的对象,并开辟一块空间存储,并返回空间的首地址;

Car *Audi = new Car();delete Audi;

2. 动态创建一个基本数据类型变量

获得一块堆内存空间;返回正确的指针。

没有了构造函数,但是可以同样在括号内赋初值。

new int(10);//返回这个空间的首地址int *arr=new int(10);//开辟一个存放整数的存储空间,附上初值,返回一个指向该存储空间的地址(即指针)delete arr;

3.动态创建一个一维数组

char* p = new char[10];//开辟一个存放字符数组(包括10个元素)的空间,返回首元素的地址delete[] p;

 4.动态创建一个二维数组

//开辟一个存放二维整型数组(大小为3*2)的空间,返回首元素的地址  int** pc = new int*[3];//这边表示开辟行数为3//int*[3]表示的为开辟三个存放int*元素的数组,所以才有了下一步pc[i]中对列数的开辟for (int i = 0; i < 3; i++){pc[i] = new int[2];//这边表示开辟列数为2for (int j = 0; j < 2; j++){pc[i][j] = i + j;cout <<pc[i][j] << " ";}cout << endl;}//或者使用另一种方法int(*pc)[2] = new int[3][2];//创建数组指针pc,注:数组指针与二级指针不一样for (int i = 0; i < 3; i++){for (int j = 0; j < 2; j++){pc[i][j] = i + j;cout <<pc[i][j] << " ";}cout << endl;} delete[] pc;

5.动态创建一个结构体对象

#include<iostream>using namespace std;struct MyStruct{int a;MyStruct* b;    MyStruct(int x): a(x), b(NULL) {};  //初始化列表构造函数  函数名与类名相同是构造函数};int main() {MyStruct* my = new MyStruct();delete my;system("pause");return 0;}


点击全文阅读


本文链接:http://zhangshiyu.com/post/83789.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1