c++中的关键字new是什么东西?

Posted 昊虹AI笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++中的关键字new是什么东西?相关的知识,希望对你有一定的参考价值。

“new”是C++的一个关键字,它通常用来在堆上创建数组或对象,但它与一般的创建数组或对象的方法不同,它在创建数组或对象时,会返回这个对象的指针。

​提问:堆是什么东西?它与栈有什么区别?
回答:栈区——由编译器自动分配和释放,一般存放函数的参数值、局部变量的值等(速度较快);堆区——由程序员分配及释放,若程序员不释放,程序结束后可能由OS回收(速度比较慢,而且容易产生内存碎片)。所以我们在使用堆的时候要注意用完后及时的释放它。
栈的速度快,但因为是内存中的一块连续区域,所以资源宝贵,通常不大。
堆的话不要求是内存中的一块连续区域,所以通常比栈大不少。
上面的回答引用自 https://www.zhihu.com/question/36489727/answer/153427698
关于堆和栈的区别大家还可参考文章:https://baijiahao.baidu.com/s?id=1675328459615668602

说回来,继续说关键字new。

本文开始说到,“new”可以用来在堆上创建数组或对象。那我们先看一下用“new”在堆上创建数组的例子。

用new创建数组的示例代码如下:

#include <opencv2/opencv.hpp>
#include <iostream>

int main()

	int bucket_size = 3;
	int *bucket;
	bucket = new int[bucket_size];
	//接下来用函数memset()把刚在堆上分配的空间按字节全部初始化为0
	memset(bucket, 0, bucket_size * 4);
	std::cout << "bucket[0]的值为:" << bucket[0] << std::endl;
	std::cout << "bucket[1]的值为:" << bucket[1] << std::endl;
	std::cout << "bucket[2]的值为:" << bucket[2] << std::endl;

	return 0;


从上面的运行结果可以看出,我们用关键字“new”在堆上创建了一个int型数组,这个数组的元素有3个,通过“new”这种形式的创建,我们得到了其头指针,这个头指针存储在int型指针变量bucket中。

为什么函数memset()的最后一个参数要乘以4?那是因为博主的C++开发环境中一个int变量占四个字节的内存空间,详情见  https://blog.csdn.net/wenhao_ir/article/details/125336402

关于函数memset()的详情和使用中要注意的问题,可参见博文:https://blog.csdn.net/wenhao_ir/article/details/125337117

上面的代码运行结果如下图所示:

接下来,说下用new来创建类的对象的情况。当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。

假如有一个类A,那么下面这条语句:

A* pa = new A(3);

大致相当于以下三句话的作用(注意只是大致上):

A* pa = (A*)malloc(sizeof(A)); //在堆上为对象分配内存空间
pa->A::A(3); //调用类A的构造函数对对象进行初始化
return pa; //返回创建对象的指针

此时,假如我们要调用类A中的成员函数fun1(),那么可以用下面这句话调用。

pa->fun1();

总结一下:关于关键词new,主要是要明白用它在堆上创建数组或对象时,它会返回创建的数组或对象的指针,返回创建的数组或对象的指针,返回创建的数组或对象的指针!重要的事情说三遍!

其实上面示例中用new得到的数组其实也可以看成是对象,所以其实new的作用可以总结为:
“new”是C++的一个关键字,它通常用来在堆上创建对象,它会返回创建的对象的指针,它会返回创建的对象的指针,它会返回创建的对象的指针,重要的事情说三遍!

以上是关于c++中的关键字new是什么东西?的主要内容,如果未能解决你的问题,请参考以下文章

c++中为啥要用new 函数()实现多态?

C++中的new/delete构造/析构函数dynamic_cast分析

C++ 数组和“new”关键字

什么是 C++ 中的动态内存分配?

什么是 C++ 中的动态内存分配?

new