• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++ new/delete相关知识点详细解析

C++ new/delete相关知识点详细解析

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++ new delete,c++中new和delete,c++ delete,c++delete函数,new delete等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

每个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区(free store)或堆(heap)。C语言用一堆标准库函数malloc和free在自由存储区中分配存储空间,而C++则用new和delete表达式实现相同的功能。

一、new和delete创建和释放动态数组:
数组类型的变量有三个重要的限制:数组长度固定,在编译时必须知道其长度,数组只在定义它的语句内存在。动态数组:长度固定,编译时不必知道其长度,通常是运行时确定;一直存在,直到程序显示释放它。

1、动态数组的定义:数组变量通过指定类型、数据名和维数来定义。而动态分配数组时,只需指定类型和数组长度,不必为数组对象命名,new表达式返回指向新分配数组的第一个元素的指针:int*pia=new int[10];在自由存储区中创建的数组对象没有名字,只能通过其地址间接访问堆中的对象。

2、初始化动态分配的数组:若数组元素具有类类型,将使用该类的默认构造函数初始化;若数组元素是内置类型,则无初始化。也可跟在数组长度后面的一堆空圆括号,对数组元素做值初始化。

string *psa=newstring[10];  //array of 10 empty strings
int *pia=newint[10];  //array of 10 uninitializedints
int *pia2=newint[10]();  //array of 10 zero

对于动态分配的数组,其元素只能初始化为元素类型的默认值,而不能像数组变量一样,用初始化列表为数组元素提供各不相同的初值。

3、const对象的动态数组:若在堆中创建的数组存储了内置类型的const对象,则必须为这个数组提供初始化:因数组元素都是const对象,无法复制。

const int*pci_ok=new const int[100]();

C++允许定义类类型的const数组,但该类型必须提供默认构造函数。

已创建的常量元素不允许修改,所以此类数组用处不大。

4、允许动态分配空数组:动态分配数组,多是由于编译时不知道数组长度。
size_t  n=get_size();    int*p=new int[n];

C++虽然不允许定义长度为0的数组变量,但明确指出,调用new创建长度为0的数组是合法的。new返回有效的非零指针。该指针不能与new返回的其他指针不同,不能进行解引用操作,因它没指向任何元素。允许的操作:比较运算。

5、动态空间的释放:程序员必须显示将其占用的存储空间返还给程序的自由存储区。C++语言为指针提供delete []表达式释放指针所指向的数组空间。

delete [] pia;[]告诉编译器该指针指向的是堆中的数组,而非单个对象,若遗漏,编译器无法发现。

二、new和delete创建和释放单个对象
定义变量时,必须指定其数据类型和名字。而动态创建对象时,只需指定其数据类型。new返回指向新创建对象的指针,通过该指针来访问此对象。

1、动态创建对象的初始化:int *pi=new int(1024)

2、动态创建对象的默认初始化:若不提供显式初始化,与函数内定义的变量初始化方式相同,类类型->默认构造函数;内置类型->无初始化。同样可做值初始化:

int *pi=newint();值初始化的()必须置于类型名后,而非变量后,int x()是声明函数。

3、撤销动态创建的对象:程序员必须显示将该对象占用的内存返回给自由存储区。delete,若指针指向不是用new分配的内存地址,则对该指针使用delete非法。

int i;  int *pi=&i;  delete pi;//编译器不能断定一个指针指向什么类型的对象,因此大部分编译器仍能通过(VS2005编译通过,执行到该处报错)。

4、零指针的删除:int *ip=0; delete ip;若指针值为0,则delete合法。

5、delete后,重设指针值:delete p;删除指针后,p成为悬垂指针。悬垂指针指向曾经存放对象的内存,但该对象已不存在,引用该内存报错。所以一旦删除指针所指向的对象,立即将指针置为0。

6、const对象的动态分配和回收:创建时初始化,且一经初始化,其值不可修改。

const int*pci=new const int(1024);new表达式返回int型const对象的指针。所以只能赋给指向const的指针。内置类型对象或未提供默认构造函数的类类型对象必须显示初始化。

删除const对象:delete pci;

三、与动态内存分配相关的三种常见程序错误:
1、删除指向动态分配内存的指针失败,称为memory leak。一般需等程序运行一段时间,耗尽内存时,才显露出来。

2、读写已删除的对象。若删除指针所指对象后,置指针值为0,易检查出此类错误。

3、对同一个内存空间使用两次delete表达式。第二次delete时,自由存储区可能被破坏。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++动态内存分配(new/new[]和delete/delete[])详解
  • C++中的delete不会将操作数置0
  • C++表达式new与delete知识详解
  • C++中delete和delete[]的区别
  • C++基础入门教程(五):new和delete
  • C++之CNoTrackObject类和new delete操作符的重载实例
  • c++中new和delete操作符用法
  • c++中new的三种用法详细解析
  • 浅析c++中new和delete的用法
  • C++ new/delete相关知识点详细解析

相关文章

  • 2022-04-30C语言位运算(按位与运算、或运算、异或运算、左移运算、右移运算)
  • 2017-05-28C和指针小结(推荐)
  • 2017-05-28学好C++必须做到的50条 绝对经典!
  • 2017-05-28Java3D实例之创建空间几何模型的实现方法
  • 2017-05-28C/C++编译器GCC下的常用编译命令总结
  • 2017-05-28c++编写简单的计算器程序
  • 2017-05-28C/C++的浮点数在内存中的存储方式分析及实例
  • 2017-05-28c语言生成随机数的方法(获得一组不同的随机数)
  • 2017-05-28c语言的cps实现求fibonacci数列示例
  • 2017-05-28C++中getline()和get()的方法浅析

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++时间戳转换成日期时间的步骤和示例代码
    • C++标准之(ravalue reference) 右值引用介绍
    • C++中事件机制的简洁实现及需要放弃的特性
    • HDOJ 1443 约瑟夫环的最新应用分析详解
    • C++基于先序、中序遍历结果重建二叉树的方法
    • C语言中 int main(int argc,char *argv[])的两个参数详解
    • 详解C语言中条件判断语句if和switch的用法
    • C++ new/delete相关知识点详细解析
    • Swift编程中的泛型解析
    • C++利用MySQL API连接和操作数据库实例详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有