基础:c++中,什么时候用 A a;和什么时候用A a=new A;

new是在堆上分配内存,它需要用delete释放,否则会造成内存泄漏(使用的内存没有即时释放,造成内存的浪费)
int main()
{
A a; //定义了一个a对象
A *p=new A; //在堆上定义了一个对象,它的指针保存在p里,注意,堆上定义的对象没有名字,必须用指针保存
return 0;
} //a到这里的时候,它占用的内存就会被回收 而p,除非调用delete p; 否则内存永远不会被回收,指针p丢弃后,那块内存没被释放,无法被再次使用,造成内存浪费

说明: 

1、全局对象和局部对象的生命期都是严格定义的,程序员不能以任何方式改变他们的生命期。但是有时候需要创建一些生命期能被程序员控制的对象,他的分配和释放可以根据程序运行中的操作来决定。这时就需要使用new操作符了。 

2、 动态分配内存,将从堆中分配内存,动态分配的存储区是在运行时确定的,动态分配的存储区可以随着需求而自动扩大.

3. 局部变量一般存储在栈中,栈是先进后出的存储结构,而堆却不是.

4. 在C++中使用new动态分配内存,delete释放以前new分配的内存.

5. 使用new运算符系统将从空闲存储区中为对象分配内存,并返回一个指向该对象的指针即该对象的地址。new运算符的特点是:

用new运算符分配的对象没有名字,对该对象的操作都要通过指针间接地完成操作。例如new int,就是从空闲存储区分配了一个int型对象  但没法对这个对象进行操作,只是       从存储区分配了这么一个空间。语句int *p=new int表示从空闲存储区分配一个int对象并把这个对象的 地址赋给p,现在p就是用new分配的int对象的地址,而*p就是那里的        值。语句int i;int*p=&i;和int *p=new int都是将int变量的地址赋给了指针,但不同的是前句可以用名称i和*p来访问该int型变量,而后句则只能用*p来访问该变量,也就是       说p指向的内存没有名称。

6. 动态创建数组:int *p=new int [11];创建动态数组时必须有[]方括号,且里面要有创建的维数,但该数组的第一维可以是一个复杂的表达式。访问地址中的内容的方法为*p    访问数组中的第一个元素,p[1]该问第二个元素,以此类推。

创建二组数组的例子:int (*p)[102]=new int [4][102]

7. 动态创建对象的初始化:int *p=new int(102)该语句表明由p指向的新创建你对象被初始化为102。动态创建对象的初始化方式为在类型名后面用一对括号来被始化。

8. 动态创建对象的默认初始化:方式为在类型名后面跟一对空的圆括号初始化,

int *p=new int ();

int *ps=new string();

cls *pc=new cls();

第一条语句把对象的值初始化为0,第二条语句对于提供了默认构造函数的string类,不论程序是要明确的不初始化,还是要求进行值初始化      都会调用默认构造函数初始化该对象。而对于内置类型或没有默认构造函数的类型,则采用不同的初始化方式就会有显著不同的差别。

例如:int *p=new int; int *p=new int();第一条语句没有被初始化,而第二条被初始化为0。

9. 用new动态创建的数组不能被初始化,不能创建初始化值集。

10.耗尽内存:如果程序用完了所有可用的内存,new表达式就有可能失败。如果new表达式无法获得要需要的内存空间,系统将会抛出名为bad_alloc异常。

11.可以在一个函数内使用new运算符分配内存,而在另一个函数中使用delete释放内存空间.delete只能用于释放前次使用new分配的空间,       不要使用delete来释放不是new分配的内存,不要使用delete释放相同的内存两次,应使用delete []来释放动态数组,例如:       int *p=new int [10];delete [] p;删除数组必须要有[]方括号。delete不一定要用于new的指针,例如int *p=new int ; int *x=p; delete x;将是合法的.如果指针的值为0,则在其上作delete操作是合法的,但没有任何意义。

12.悬垂指针:执行delete p后只是把p所指向的地址的内容给释放掉了,并没有删掉指针p本身,还可以将p重新指向到另一个新的内存块, 因此p还指向原来他指向的对象的地址,然而p所指向的内容却已经被释放了,因此p不再有效而变得没有定义了。这样的指针称为悬垂指针。 悬垂指针往往导致程序错误而且很难检测出来。一般可以将p=NULL;

13.静态联编:如果通过声明来创建数组,则在程序被编译时为他分配内存空间,不管程序是否使用数组,数组都在那里,占用了内存。       在编译时给数组分配内存被称为静态联编。意味着数组是在编译时加入到程序中的。但使用new时,如果在运行阶段需要数组,则创建他,       如果不需要,则不创建,还可以在程序运行时选择数组的长度,这被称为动态联编。意味着数组是在程序运行时创建的,这种数组叫做 动态数组,使用静态联编时必须在编写程序的时候指定数组的长度,使用动态联编时,程序将在运行时确定数组的长度。

转自:http://blog.csdn.net/frank06504/article/details/6230375

随机推荐

  1. POJ 1845 求a^b的约数和

    题目大意就是给定a和b,求a^b的约数和 f(n) = sigma(d) [d|n] 这个学过莫比乌斯反演之后很容易看出这是一个积性函数 那么f(a*b) = f(a)*f(b)  (gcd(a,b) ...

  2. android Xutils dbutils 注解

    xUtils DbUtils 关于实体类注解 汇总 RockyZhang 发布于 1年前,共有 0 条评论 先来官方demo DbUtils db = DbUtils.create(this);    ...

  3. [VMware WorkStation]虚拟机网络

    桥接模式下复制物理网络连接: 复制物理网卡连接状态,就是说把你指定的.本机的.真是网卡的状态信息复制给虚拟机的虚拟网卡,比如说你的本机真是网卡链接到了家用路由器的LAN口上,获得到了DHCP分配的地址 ...

  4. 关于Mapper、Reducer的个人总结(转)

    Mapper的处理过程: 1.1. InputFormat 产生 InputSplit,并且调用RecordReader将这些逻辑单元(InputSplit)转化为map task的输入.其中Inpu ...

  5. JVM-垃圾收集器

    Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商,不同版本的虚拟机所提供的垃圾收集器可能会有很大差距.  HotSpot虚拟机示意图: 说明:两个收集器之间存在连线说明它们可 ...

  6. 关于高并发的aotomic

    AtomicInteger线程安全的根源,熟悉并发的同学一定知道在java中处理并发主要有两种方式: 1,synchronized关键字,这个大家应当都各种面试和笔试中经常遇到. 2,volatile ...

  7. BZOJ 2393 Cirno的完美算数教室

    就是爆搜嘛. 先从大到小排个序能减去dfs树上很大的一部分.这个技巧要掌握. #include<iostream> #include<cstdio> #include<c ...

  8. CSS样式选择器

    <!-- css样式选择器 HTML选择器 类选择器 ID选择器 关联选择器 组合选择器 伪元素选择器 selector{ /* selector是样式选择器 property:value; / ...

  9. ERP通用存储过程封装(三)

    一:解释      SQL Server提供了一种方法:可以将一些预先编译的SQL语句集中起来由SQL Server数据库服务器来完成以实现某个任务,这就是存储过程.存储过程常驻在SQL Server ...

  10. Java 集合深入理解(14):Map 概述

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 终于把 List 常用的几种容器介绍完了,接下来开始 Map 的相关介绍. 什么是 Map Java 中的 Map 接口 ...