《C和C++代码精粹》——1.15 new和delete

1.15 new和delete

C和C++代码精粹
在C语言中为了用堆栈,需要计算出所要创建的对象的大小:

struct Foo*fp =malloc(sizeof(struct Foo) );

在C++中,运算符new用于计算出对象的大小:

Foo*fp=new Foo;

在C语言中分配数组,需调用不同的函数。

struct Foo*fpa= calloc(n,sizeof(struct Foo));

在C++中,new运算符会知道数组的大小:

Foo*fpa=new Foo[n];

此外,运算符 new 在返回指针之前,自动调用适当的构造函数来初始化对象。例如,在堆栈中创建复数时,编译器会自动将它们初始化,如下:

complex *cp1= new complex;     // -> (0,0)
complex *cp2= new complex(1);   // -> (1,0)
complex *cp3= new complex(2,3);  // -> (2,3)

可以用delete运算符的两种形式之一,把动态内存返还给堆栈,对于单独的对象可以这样做:

delete fp;
delete cp1;

但是,释放一个数组需要不同的句法:

delete [ ] fpa; // 释放数组句法
像C++的一些其他特性一样,new 和 delete 提高了程序的类型安全性。用户不仅仅是申请一些内存,还有带有适当的类型检查和初始化的对象。如果想了解更多的关于内存管理的内容,请参见第20章。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

时间: 2024-11-26 23:55:15

《C和C++代码精粹》——1.15 new和delete的相关文章

《C和C++代码精粹》——2.15 小结

2.15 小结 C和C++代码精粹C和C++仅仅与那些使用它们的人一样危险.指针是地址.可以将任何一个指针赋值成void*.注意区分一个const指针和一个指向const的指针.p±n = =(char)p±n sizeof (*p).p-q = = ±n .*(a+i) = = a [i].除非在sizeof和&的上下文中,否则一个数组名即是指向它第一个元素的指针.没有多维数组,只有数组的数组.仅是指针的存在并不要求它所引用的类型的实现的有效性(这是一个不完全类型).如果理解了这些概念,你就正

《C和C++代码精粹》——2.11 更高深的内容

2.11 更高深的内容 C和C++代码精粹 我们可以很自然地得出以下结论:一个三维数组是二维数组的集合. int a[2] [3] [4]={{{0,1,2,3},{4,5,6,7},{8,9,0,1}}, {{2,3,4,5},{6,7,8,9},{0,1,2,3}}}; 这个数组的第一个元素是一个"二维数组" a[0](从技术上来说,a[0]是一个由3个含有4个整数的数组的数组),为了使指针与数组名a一致,定义: int (*p) [3] [4] = a; 程序清单2.16是一个应

《C和C++代码精粹》——2.7 指针和一维数组

2.7 指针和一维数组 C和C++代码精粹 在程序清单2.7中,会注意到在传递数组 s 时并没有使用它的地址,这是因为C和C++在大多数表达式中把数组名转换成指向它第一个元素的指针.自1984年以来,我已经向成百上千的学生讲授了C和C++,我注意到了指针和数组,特别是指针和多维数组之间的关系造成很多迷惑. 这样说似乎很奇怪,但是C++确实不支持数组,至少C++不像支持第一类数据类型如整型或者甚至结构体那样支持数组.考虑以下的语句: int i=1,j; int a[4]={0,1,2,3},b[

《C和C++代码精粹》导读

前言 C和C++代码精粹 本书适合于那些C和C++的职业程序员.假如你已熟悉这两种语言的语法和基本结构,这本书能够为你创建有效的.实用的程序提供实践性的指导.每一个代码范例或程序范例均标明行之有效的用法和技术,这些用法和技术对C/C++这两种重要编程语言的性能发挥起着重要的作用. 对于那些希望在工作中加强自身技术和提高效率的人来说,本书可以算是一本经验之谈.尽管目前人们对面向对象模式的推崇到了白热状态(本书也包括这方面的丰富内容),可是我没有理由不对C++的基础-C表示尊崇.我发现太多的程序开发

《C和C++代码精粹》——2.10 指针和多维数组

2.10 指针和多维数组 C和C++代码精粹实际上,在C++中没有多维数组!至少对多维数组没有直接的支持.人们通常把一个一维数组看作一个向量,把一个二维数组看作一个表或者矩阵,把一个三维数组看作一个长方体.然而,数组的几何模型使明智地使用高维数组变得很困难,取而代之的是C++支持"数组的数组"的概念.例如,如果一个一维的整型数组为 int a[4]={0,1,2,3}; 它是一个有索引的整数集合: 我们通常把它描述成一个向量: 对一个二维整型数组,如: int a[3][4]={{0,

《C和C++代码精粹》——1.10 操纵器

1.10 操纵器 C和C++代码精粹 当标识符 endl出现在一个输出流中时,一个换行字符就被插入并且流被刷新.标识符endl是操纵器的一个例子,即为了副效应而插入到流的一个对象.在〈iostream〉中被声明的系统预定义的操纵器列于表 1.3中.程序清单1.11里的程序在功能上与程序清单1.10的程序等价,但它是用操纵器来代替显式调用setf函数.操纵器经常可以使代码更为高效. 表1.3 简单的操纵器(〈iostream〉) 程序清单1.11 用操纵器改变数据基数 // base2.cpp:

《C和C++代码精粹》——2.5 普通指针

2.5 普通指针 C和C++代码精粹 通常编写能接收指向任意类型参数的函数是很方便的.这是很有必要的,例如,用标准的库函数memcpy,能够从一个地址向另一个地址拷贝一块内存.你也可能想调用memcpy来拷贝自己创建的结构: struct mystruct a,b; /.../ memcpy(&a,&b,sizeof(struct mystruct)); 为了操作任意类型的指针,memcpy把它头两个参数声明为void型指针.可以不需要强制类型转换将任何类型的指针赋予void类型.也可以在

从把三千行代码重构成15行代码谈起

从把三千行代码重构成15行代码谈起 如果你认为这是一个标题党,那么我真诚的恳请你耐心的把文章的第一部分读完,然后再下结论.如果你认为能够戳中您的G点,那么请随手点个赞. 把三千行代码重构为15行 那年我刚毕业,进了现在这个公司.公司是搞数据中心环境监控的,里面充斥着嵌入式.精密空调.总线.RFID的概念,我一个都不懂.还好,公司之前用Delphi写的老客户端因为太慢,然后就搞了个Webform的替代,恰好我对Asp.Net还算了解,我对业务的不了解并不妨碍我称成为这个公司的一个程序员.小公司也有

《C和C++代码精粹》——1.2 循序渐进

1.2 循序渐进 C和C++代码精粹 在没有完全掌握C++的情况下也可以有效地使用它.事实上,面向对象技术承诺如果供应商为重用.可扩展性提供设计好的类库,那么建立应用程序的工作就很容易了.现有的开发环境,及其应用程序框架和可视化组件,正在兑现这一承诺. 如果觉得必须要掌握这种语言,可以一步步地去做,并且在这一过程中可以取得丰硕的成果.已出现的3个"顶峰"是: 1.更好的C: 2.数据抽象: 3.面向对象编程. 由于C++比C更安全.更富于表达,所以可以将它作为一个更好的C使用.这个顶峰