`
hulianwang2014
  • 浏览: 744989 次
文章分类
社区版块
存档分类
最新评论
  • bcworld: 排版成这样,一点看的欲望都没有了
    jfinal

new和delete

 
阅读更多

一 数组和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运算符动态分配内存空间的方法编写程序。

    用new和delete运算符动态分配内存空间的方法编写程序。从键盘输入33整型数组的数据,并计算出所有元素之和,打印出最大值和最小值。输入输出要用流运算符实现。

    C语言也能面向对象(三)——通用的new和delete

    本文“C语言也能面向对象(三)——通用的new和delete”探讨了如何在C语言中实现类似C++中的内存管理和对象创建。 C++中的`new`和`delete`是动态内存分配的关键操作。`new`关键字用于在运行时为对象分配内存,并...

    关于new和delete的详细用法

    关于new和delete的详细用法 1. new是C++的一个关键字,同时也是操作符。它可以用于在堆上动态创建一个对象,实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。 2. new的三种形态:new operator...

    使用new和delete创建二维数组

    使用new和delete创建二维数组,作业习题中的一道,希望能有所帮助

    c++语言,new和delete

    有关于c++方面new和delete的用法及关注

    C++之new和delete表达式

    C++之new和delete表达式

    布尔型、new和delete运算符、引用型变量[参考].pdf

    布尔型、new和delete运算符、引用型变量 布尔型变量是有两种逻辑状态的变量,它包含两个值:真和假。如果在表达式中使用了布尔型变量,那么将根据变量值的真假而赋予整型值1 或 0。要把一个整型变量转换成布尔型...

    New Delete

    在C++ Primer中,“New Delete”章节详细讲解了如何使用new和delete操作符来分配和释放动态内存,以及在此过程中可能遇到的问题和最佳实践。 ### 一、`new`操作符 #### 1. 基本用法 `new`操作符用于在运行时动态地...

    动态内存分配操作符new和delete

    在C++中,`new`和`delete`操作符是用于动态内存管理的关键工具,而`new[]`和`delete[]`则是针对数组进行动态内存分配和释放的特殊形式。 `new`操作符: `new`操作符用于向系统申请一块内存空间。当使用`new`关键字...

    C语言也能面向对象(二)——new和delete

    本文将深入探讨C++中的"new"和"delete"操作符,这是理解和掌握C++内存管理的关键。 面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它基于“对象”的概念,这些对象封装了数据和操作这些...

    C++内存管理详解,new,delete的合理使用

    内存管理主要包括动态内存分配和释放,其中new和delete是C++中进行动态内存操作的关键关键字。 首先,理解new和delete的基本用法是至关重要的。new用于在堆上分配内存,同时调用构造函数来初始化新创建的对象。例如...

    C++ 使用new与delete需注意的原则

    C++的动态内存管理是通过new和delete两个操作来完成的,即用new来申请空间,用delete来释放空间。在使用new和delete时,注意以下原则。 1.new与delete需一一对应 用new操作申请空间,如果申请成功,必须在以后的某个...

    定制new / delete的性能分析

    标题和描述均聚焦于“定制new / delete的性能分析”,这一主题在IT行业尤其是C++编程领域具有重要的实践意义。文章深入探讨了自定义new和delete运算符的动机、实施细节以及性能考量,通过实证研究揭示了自定义内存...

    C++中new和delete的介绍

    C++中new和delete的介绍 C++中的new和delete是两个非常重要的操作符,它们分别用于动态申请和释放内存。今天我们将深入探讨C++中new和delete的介绍,了解它们的区别、使用方法和注意事项。 一、new和delete的概念 ...

    C++new和delete详细解析

    C++中的new 和delete 是操作符,new 分配对象时候会自动调用构造函数,delete对象时候,会自动调用析构函数,而C语言中 malloc() 和 free() 是函数。 理论上malloc free 和 new 、delete 可以混搭用,但是好不要...

    new,delete和指针

    "new,delete和指针" new、delete和指针是C++中的一些基本概念,它们是C++内存管理的基础。在本文中,我们将详细讲解new、delete和指针的概念和使用方法,并对它们之间的关系进行详细的解释。 首先,让我们来了解...

    17~C++ new和delete运算符重载

    在C++编程语言中,`new` 和 `delete` 是两个关键的运算符,用于动态内存分配和释放。当我们创建类的对象或者数组时,如果希望自定义内存管理的行为,可以重载这些运算符。在本例中,我们将讨论如何重载 `A` 类的 `...

    11_new&delete与malloc&free 之间的关系与区别1

    "new与delete和malloc与free之间的关系与区别" 在C++编程语言中,new和delete是C++的关键字,是一种操作符,可以被重载,而malloc和free是C语言的库函数,并且不能重载。这两对函数都是用于内存管理的,但是它们...

    C++中new/delete与new[]/delete[]的使用区别

    `new`和`delete`关键字用于为对象分配和释放动态内存,而`new[]`和`delete[]`则针对数组进行操作。下面我们将深入探讨这四个运算符的使用、区别以及它们在内存管理中的作用。 首先,`new`和`new[]`都是用来动态分配...

    深入浅析C++的new和delete

    深入浅析C++的new和delete C++ 中的 new 和 delete 是一种特殊的运算符,它们不仅承载着内存分配的功能,还承载着对象构造函数的调用功能。下面将详细介绍 new 和 delete 的内部实现机制。 new 运算符 new 运算符...

Global site tag (gtag.js) - Google Analytics