一 数组和new
数组类型变量三个重要限制:
1 数组长度不变
2 在编译时必须知道其长度
3 数组只在定义它的块语句内存在
突破数组的限制
针对2 需要在运行时动态的分配数组
针对3 动态分配的数组一直存在,直到程序显示释放它
自由存储区:又叫做堆。每一个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区或堆。
C语言使用一对标准库函数:malloc和free
C++则使用new和delete
1 动态数组的定义
int *p = new int [10]; //array of 10 uninitialized ints
返回指向数组第一语速的指针,此返回值初始化了指针 p
在自由存储区中创建数组对象是没有名字的,程序员只能通过其地址间接的访问堆中对象
2初始化动态分配的数组
string *psa = new string [10];
注意:这里分配了对象的内存空间后,将调用string类型的默认构造函数一次初始化数组中的每个函数
int *pia2 = new int [10](); //array of 10 initialized ints
可以在数组长度分配一对空括号,对数组元素做值初始化圆括号要求编译器对数组做值初始化。
i nt *pia2 = new int [10](); 等同于nt *pia2 = new int [10](0);
动态分配的数组全部被初始化为0
3 const 对象的动态数组
const int *pci_ok = new const int [100]();
const string *pci = new const string[100];
当然,创建常量元素不予续修改
4允许动态分配空数组
原因:编译时不知道数组的长度,编写一下代码:
size_t n = get _size();
int *p = new int [n];
如果get_size 返回 0 ,怎么办?
答案是:代码仍然正确执行
C++虽然不允许定义长度为0的数组,但是明确指明调用new动态创建长度为0 的数组时合法的。
char arr[0];//error
int *p = new char [0];
5 动态空间的释放
delete[]表示释放指针所指向的数组空间
delete [] pia;
方括号:如果漏了空方括号对,编译器无法发现错误
可导致少释放了内存空间,产生内存泄漏,严重的运行错误等
二 对象和new
定义变量时,必须指定其数据类型和名字。而动态创建时,只需指定其数据类型,而不必为该对象命名。
int i ;
int *p = new int;
1 动态创建对象的初始化
int i(1024);
int *pi = new int(1024);
string s(10,’9’);
string *ps = new string(10, ‘9’);
2 动态创建对象的默认初始化
对于类类型的对象,用该类的默认构造函数初始化
string *ps = new string ;
内置类型的对象则无初始化
int *pi = new int ;
通常,除了对其复制之外,对未初始化的对象所关联的值的任何使用都没有定义的。
对动态创建的对象做值的初始化
string *ps = new string(); //initialized to empty string
int *pi = new int (); //pi points to an int value-initialized to 0;
cls *pc = new cls(); //pc points to a value-initialized of type cls
对于提供了默认构造函数的类类型string,没有必要对其对性进行值的初始化:无论程序是明确的不初始化哈市要求进行值初始化,都会自动调用其默认构造函数初始化该对象。
3耗尽内存
New失败,系统将抛出名为bad_alloc的一场
4 撤销动态创建的对象
delete pi;
5 0指针的删除
int *ip = 0;
delete ip;
删除0指针式安全
6 在delete之后重设指针的值
执行语句
delete p;后,p变成没有定义。
在很多机器上,尽管p没有定义,蛋仍然存放了它之前所指向对象的地址,然而p所指向的内存已经已经被释放,因此p不再有效。
删除指针后,该指针变成悬垂指针。
悬垂指针 :指向曾经存放对象的内存,蛋该对象已经不再存在了。
悬垂指针往往导致程序的错误,而且很难检测出来
注意: 一旦删除了指针所指向的对象,立即将指针置0,这样就非常清楚的表明指针不再指向任何对象。
7 const 对象的动态分配和回收
const int *pci = new const int(1024);
与其他常量一样,动态创建的const对象必须在创建时初始化,并且一经初始化,其值就不能再修改。与其他const对象的地址一样,由于new返回的地址上存放的是const对象,因此该地址只能付给指向const的指针。
const string *pcs = new const string ;
8 删除const对象
尽管程序员不能够改变const对象的值,但可撤销对象本身。Const对象也是使用删除指针来释放的
delete pci;
程序错误与动态分配内存分配:
1 删除指向动态分配内存的指针失败,因而无法将该块内存返还给自由存储区,删除动态分配内存失败称为“内存泄漏(memory leak)”。内存泄漏很难发现,等程序运行了一段时间后,耗尽内存空间时,内存泄漏才会显露出来。
2 读写已删除的对象。
如果删除指针所指向的对象之后,将指针置为0值,则比较容易检测出这类错误。
3 对同一个 呢此存空间使用两次delete表达式。
当两个指针指向同一个动态创建的对象,删除时就会发生错误。如果在其中一个指针上做delete运算,将该对象的内存空间返还给自由存储区,然后接着delete第二个指针,此时则自由存储区可能会被破坏。
分享到:
相关推荐
用new和delete运算符动态分配内存空间的方法编写程序。从键盘输入33整型数组的数据,并计算出所有元素之和,打印出最大值和最小值。输入输出要用流运算符实现。
本文“C语言也能面向对象(三)——通用的new和delete”探讨了如何在C语言中实现类似C++中的内存管理和对象创建。 C++中的`new`和`delete`是动态内存分配的关键操作。`new`关键字用于在运行时为对象分配内存,并...
关于new和delete的详细用法 1. new是C++的一个关键字,同时也是操作符。它可以用于在堆上动态创建一个对象,实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。 2. new的三种形态:new operator...
使用new和delete创建二维数组,作业习题中的一道,希望能有所帮助
有关于c++方面new和delete的用法及关注
C++之new和delete表达式
布尔型、new和delete运算符、引用型变量 布尔型变量是有两种逻辑状态的变量,它包含两个值:真和假。如果在表达式中使用了布尔型变量,那么将根据变量值的真假而赋予整型值1 或 0。要把一个整型变量转换成布尔型...
在C++ Primer中,“New Delete”章节详细讲解了如何使用new和delete操作符来分配和释放动态内存,以及在此过程中可能遇到的问题和最佳实践。 ### 一、`new`操作符 #### 1. 基本用法 `new`操作符用于在运行时动态地...
在C++中,`new`和`delete`操作符是用于动态内存管理的关键工具,而`new[]`和`delete[]`则是针对数组进行动态内存分配和释放的特殊形式。 `new`操作符: `new`操作符用于向系统申请一块内存空间。当使用`new`关键字...
本文将深入探讨C++中的"new"和"delete"操作符,这是理解和掌握C++内存管理的关键。 面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它基于“对象”的概念,这些对象封装了数据和操作这些...
内存管理主要包括动态内存分配和释放,其中new和delete是C++中进行动态内存操作的关键关键字。 首先,理解new和delete的基本用法是至关重要的。new用于在堆上分配内存,同时调用构造函数来初始化新创建的对象。例如...
C++的动态内存管理是通过new和delete两个操作来完成的,即用new来申请空间,用delete来释放空间。在使用new和delete时,注意以下原则。 1.new与delete需一一对应 用new操作申请空间,如果申请成功,必须在以后的某个...
标题和描述均聚焦于“定制new / delete的性能分析”,这一主题在IT行业尤其是C++编程领域具有重要的实践意义。文章深入探讨了自定义new和delete运算符的动机、实施细节以及性能考量,通过实证研究揭示了自定义内存...
C++中new和delete的介绍 C++中的new和delete是两个非常重要的操作符,它们分别用于动态申请和释放内存。今天我们将深入探讨C++中new和delete的介绍,了解它们的区别、使用方法和注意事项。 一、new和delete的概念 ...
C++中的new 和delete 是操作符,new 分配对象时候会自动调用构造函数,delete对象时候,会自动调用析构函数,而C语言中 malloc() 和 free() 是函数。 理论上malloc free 和 new 、delete 可以混搭用,但是好不要...
"new,delete和指针" new、delete和指针是C++中的一些基本概念,它们是C++内存管理的基础。在本文中,我们将详细讲解new、delete和指针的概念和使用方法,并对它们之间的关系进行详细的解释。 首先,让我们来了解...
在C++编程语言中,`new` 和 `delete` 是两个关键的运算符,用于动态内存分配和释放。当我们创建类的对象或者数组时,如果希望自定义内存管理的行为,可以重载这些运算符。在本例中,我们将讨论如何重载 `A` 类的 `...
"new与delete和malloc与free之间的关系与区别" 在C++编程语言中,new和delete是C++的关键字,是一种操作符,可以被重载,而malloc和free是C语言的库函数,并且不能重载。这两对函数都是用于内存管理的,但是它们...
`new`和`delete`关键字用于为对象分配和释放动态内存,而`new[]`和`delete[]`则针对数组进行操作。下面我们将深入探讨这四个运算符的使用、区别以及它们在内存管理中的作用。 首先,`new`和`new[]`都是用来动态分配...
深入浅析C++的new和delete C++ 中的 new 和 delete 是一种特殊的运算符,它们不仅承载着内存分配的功能,还承载着对象构造函数的调用功能。下面将详细介绍 new 和 delete 的内部实现机制。 new 运算符 new 运算符...