C++new用法详解

这篇具有很好参考价值的文章主要介绍了C++new用法详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.什么是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;//返回内存空间地址00995B08

cout << *p << endl;//返回初始值10

delete 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];//这边表示开辟列数为2
		for (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.动态创建一个结构体对象文章来源地址https://www.toymoban.com/news/detail-482650.html

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

到了这里,关于C++new用法详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SQL开发实战技巧】系列(三十):数仓报表场景☞树形(分层)查询如何排序?以及如何在树形查询中正确的使用where条件

    【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串UNION与OR的使用注意事项 【SQL开发实战技巧】系列

    2023年04月09日
    浏览(71)
  • 【KNN算法详解(用法,优缺点,适用场景)及应用】

    KNN(K Near Neighbor):k个最近的邻居,即每个样本都可以用它最接近的k个邻居来代表。KNN算法属于监督学习方式的分类算法,我的理解就是计算某给点到每个点的距离作为相似度的反馈。 简单来讲,KNN就是“近朱者赤,近墨者黑”的一种分类算法。 KNN是一种基于实例的学习,

    2024年02月05日
    浏览(41)
  • 【知识点】np.where()用法

    目录 一、基本知识 二、具体实例 1.np.where(condition,x,y) (1)示例1: (2)示例2: (3)示例3: 2. np.where(condition) 总结 np.where 函数是三元表达式 x if condition else y 的向量化版本,它有两种用法: 1.np.where(condition,x,y) 当where内有三个参数时,第一个参数表示条件,当条件成立时

    2024年02月01日
    浏览(36)
  • Mysql 中,为什么 WHERE 使用别名会报错,而 ORDER BY 不会报错?

       我们先对salary * 12 命名一个别名annual_sal  这段代码以annual_sal升序输出且正常执行没有报错。说明 order by 可以使用别名  我们再看看这个段代码 这段代码就报错了,报错说明是 Unknown column \\\'annual_sal\\\' in \\\'where clause\\\'。 由此可以得出where语句执行是找不到annual_sal. 要解决这个问

    2023年04月15日
    浏览(44)
  • SQL group by、where和having语句用法

    SQL 语句中的 GROUP BY 子句用于将具有相同值的行分组在一起,通常与聚合函数(如 COUNT、SUM、AVG 等)一起使用。WHERE 子句用于筛选符合条件的行。HAVING 子句则在分组后对分组结果进行进一步筛选。 以下是一个使用 SQL 语句中的 GROUP BY、WHERE 和 HAVING 子句的示例: 在这个示例中

    2024年02月07日
    浏览(59)
  • Web Worker的概念、用法、使用场景

    ​ 目录 1. 简介 2. 适用场景 2.1 复杂计算 2.2 后台下载 2.3 数据处理 2.4 实时通信 3. 代码示例 3.1 Worker特性检测 3.2 Worker API 3.3 SharedWorker API 3.4 创建 JavaScript 文件 3.5 创建 Web Worker 4. 总结 Web Worker  使得在一个独立于 Web 应用程序主执行线程的后台线程中运行脚本操作成为可

    2024年02月08日
    浏览(30)
  • 带你深入理解HandlerThread 的使用场景和用法

    HandlerThread是Android中的一个线程类,它是Thread的子类,并且内部封装了Looper和Handler,提供了更方便的消息处理和线程操作。HandlerThread常用于需要在后台执行耗时任务,并与UI线程进行交互的场景。 使用HandlerThread可以实现以下功能和优势: 后台线程执行任务:HandlerThread在后台

    2024年02月07日
    浏览(42)
  • Gateway网关路由以及predicates用法(项目中使用场景)

    1.Gateway+nacos整合微服务 服务注册在nacos上,通过Gateway路由网关配置统一路由访问 这里主要通过yml方式说明: route:     config:     #type:database nacos yml     data-type: yml     group: DEFAULT_GROUP     data-id: jeecg-gateway-router 配置路由:   通过断言里Path地址访问到对应的system-service服务

    2024年02月12日
    浏览(86)
  • freemarker模板在客服域的使用场景及用法介绍

    🍊 Java学习:社区快速通道 🍊 深入浅出RocketMQ设计思想:深入浅出RocketMQ设计思想 🍊 绝对不一样的职场干货:大厂最佳实践经验指南 📆 最近更新:2023年7月15日 🍊 点赞 👍 收藏 ⭐留言 📝 都是我最大的动力! freemarker.template 是一个Java库,用于生成文本输出(如HTML、X

    2024年02月16日
    浏览(37)
  • C++野指针(Wild Pointers)是什么?如何避免?如何正确地使用new和delete?

    C++野指针(Wild Pointers)是什么?如何避免? C++野指针(Wild Pointers)指的是那些指向无效内存地址的指针。野指针通常是由于内存管理不当导致的,比如未初始化的指针、指向已释放内存的指针、越界访问导致的指针等。野指针是非常危险的,因为它们可能引发未定义行为,

    2024年02月20日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包