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

C++ new与delete

时间:2023-12-18 15:36:42浏览次数:41  
标签:初始化 10 int double C++ new delete

C++ newdelete

C语言中,动态分配内存时一般常使用malloc()函数,但是对于非内置数据类型(如structenumclass),
malloc()free()无法满足动态对象的需求,因此C++引入newdelete关键字,用来进行内存申请与释放空间。
1.new运算符
new运算符用来申请一块连续的内存,其格式如下:

new 数据类型(初始化列表)

malloc()函数申请内存时返回一个void*类型的指针,而newmalloc()不同,它分类一块存储空间并且指定了类型信息,并根据初始化列表中给出的值进行初始化,
是直接可以使用的内存,这个过程,常称为new一个对象
。而且new动态创建对象不必为该对象命名,直接指定数据类型即可。如果申请内存成功,返回一个类型指针,如果内存申请失败,则返回NULL

new创建基本数据类型对象,示例代码如下:

char *pc = new char;//申请一段空间用来存储`char`类型,内存中没有初始化值
intg *pi = new int(10);//申请一段空间存储`int`类型数据,初始化值为`10`
double *pd = new double();//申请一段空间存储`double`类型的数据,默认初始化值为`0`

上述代码分别用new创建了charintdouble三个对象,其中char对象没有初始化列表,新分配内存中没有初始化值;int对象初始化列表为10,是分配一个空间存储int类型数据,并把10存入该空间;double对象初始化
列表为空,表示用0初始化该对象。
new数组时,后面可以加小括号(),但括号中不可以有指定任何初始值,加小括号时由编译器为其提供默认初始值,而不加小括号时不提供任何初始值。例如:

int *pi = new int[10]();
char *pc = new char[10];
double *pd = new double[0];

pi所指向的数组中10个元素初始化为0pc所指向的数组中没有提供初始值,而pd是一个长度为0double类型数组,C++中不允许定义长度为0的数组变量,但明确指出,调用new创建长度为0的数组是合法的。它返回有效的非零指针,但该指针不能进行有效的解引用操作,因为其没有指向任何元素,它主要的作用是用于比较运算。
除了上述数组创建外,new还可以创建const对象的动态数组,但是const对象数组一旦创建就不能更改,因此意义不大,只需要知道即可。
2.delete运算符
用new运算符分配内存,使用后要及时释放以免造成内存泄露,C++提供了delete运算符来释放new出来的内存空间,其格式如下:
delete 指针名;
直接作用域指针就可以删除由new创建的对象,释放指针所指向的内存空间,但是在释放数组对象时要在指针名前面加[],其格式如下:
delete []指针名;
​ 如果漏掉了[],编译器在编译时无法发现错误,但它会导致少释放内存空间,产生内存泄露严重时会产生运行错误等。
实例:

#include<iostream>
using namespace std;
int main(){
	int *pi = new int(10);
	cout << "*pi = " << *pi << endl;
	char *pc = new char[10];
	for(int i = 0; i<10; i++)
		pc[i] = i + 65;//向数组中存入元素
	for(int i = 0; i < 10; i++)
		cout << pc[i] << " ";
	cout << endl;
	delete pi; //释放int对象
	delete [] pc;//释放数组对象
	system("pause");
	return 0;
}

结果:

标签:初始化,10,int,double,C++,new,delete
From: https://www.cnblogs.com/bonne-chance/p/17911342.html

相关文章

  • 万字长文全面详解现代C++智能指针:原理、应用和陷阱
    现代C++智能指针详解:原理、应用和陷阱智能指针是C++11引入的新特性。本篇文章详细介绍了C++智能指针的原理、应用与陷阱,通过丰富的代码实例介绍了三种智能指针:std::unique_ptr、std::shared_ptr和std::weak_ptr的原理、使用方法和适用场景,还介绍了智能指针的线程安全性、使用陷阱......
  • 关于`.Net Core`捕捉`C/C++`中的异常
    结论开门见山的说,.NetCore无法捕捉在C/C++编写的Dll中的方法的异常和错误。说明在.NetFramework框架期间,可以通过为方法增加特性:HandleProcessCorruptedStateExceptionsAttribute,或者使用RuntimeWrapperException捕捉运行时的错误,但是在.NetCore框架中,上述特性已经不再生......
  • 2023最新初级难度C++面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-初级难度C++面试题合集问:C++支持哪些基本数据类型?C++支持以下基本数据类型:布尔型、字符型、整型(包括短整型、长整型、无符号整型)、浮点型(包括单精度浮点型和双精度浮点型)、复数型以及枚举型等。此外,C++还提供了一些复合类型,如数组、结......
  • C++(虚函数和纯虚函数的区别)
    在C++中,虚函数和纯虚函数都与面向对象编程中的多态性相关,但它们有一些关键的区别。虚函数(VirtualFunction):定义:虚函数是在基类中声明并在派生类中定义的函数,使用virtual关键字进行声明。在基类中可以提供一个默认实现,但在派生类中可以选择覆盖(override)它。实现:虚函数可......
  • C++调用opencv使用透明遮罩进行模板匹配定位——以梦幻西游鼠标为例
    目录程序简介程序/数据集下载代码分析程序简介项目调用C++的opencv模块进行模板匹配,即在一张源图上找到对应模板图最相似的位置,网上大多数使用matchTemplate方法并没有使用到mask遮罩(也可以叫掩膜),而在现实情况中不规则的模板更为常见,而模板加遮罩则可以实现不规则模板,本文以梦......
  • 60道C++STL高频题整理(附答案背诵版)
    1.请解释vector容器和它的特点。在C++中,vector是标准模板库(STL)的一部分,它是一个动态数组。与普通数组相比,它的大小可以在运行时动态改变。下面是vector的一些主要特点和应用场景:动态大小:与传统的数组不同,vector可以根据需要动态地扩展或缩减大小。这意味着你不需要事先知道数......
  • C++ 基础高频题整理(附答案背诵版)
    1.C和C++有什么区别?C++是C语言的超集(我看网上很多文章说这是不对的),这意味着几乎所有的C程序都可以在C++编译器中编译和运行。然而,C++引入了许多新的概念和特性,使得两种语言在一些关键点上有显著的区别。以下是C和C++的一些主要区别:面向对象编程:C++支持面向对象编程(OOP),包括类......
  • C和C++练习
    要点:1、数组2、冒泡排序BubbleSort3、带指针的结构体(malloc,free)4、字符串操作(拷贝、逆序、比较)5、格式化输出printf,sprintf6、格式化输入,scanf,sscanf7、文件操作fopen,feof,EOF,fputc,fgetc,fputs,fgets,stdin,stdout8、数组传参(需要指定长度)、字符串传参(不需指定长度......
  • C++ Qt开发:自定义Dialog对话框组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍自定义Dialog组件的常用方法及灵活运用。在之前的文章中笔者已经为大家展示了默认Dialog组件的使......
  • C++中SQLite数据库操作实例:查询、增加、修改、删除一网打尽
     在C++中使用SQLite数据库需要使用SQLite的C/C++接口。以下是一个简单的示例,演示如何在C++中使用SQLite,并提供了常见的查询、增加、修改和删除功能。为了使用SQLite,你需要下载SQLite的C/C++接口,并链接到你的项目中。首先,确保你已经下载了SQLite的C/C++接口,然后将头文件和库文......