new总结
基础: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
随机推荐
- android 判断网络是否连接
package com.liucanwen.baidulocation.util; import android.app.Activity; import android.content.Contex ...
- IOS界面切换
好吧!表示这几天要实现 phonegap 打开IOS原生界面,因此也查询了一些方案. 有如下几种: 第一种:navigationcontroller //进入下层 [self.navigationC ...
- JAVA 打印九九乘法表
/** * * @author liangxiaoyu * @version 1.0 *2015-09-18 */public class JJ { public static void main( ...
- C语言:typedef 跟 define 的区别
typedef (int*) pINT1;以及下面这行:#define pINT2 int* pINT1 a,b; 与pINT2 a,b; 定义的a,b 有差别吗 回答: typedef作为类型定义关 ...
- WPF制作子窗体的弹出动画效果
创建一个WPF应用程序WpfApplication1,新建个窗体DialogWin <Windowx:Class="WpfApplication1.DialogWin" xm ...
- mysql 批量创建表
使用存储过程 BEGIN DECLARE `@i` int(11); DECLARE `@sqlstr` varchar(2560); SET `@i`=0; WHILE `@i` < ...
- GSM cell phone calls use outdated encryption that can now be cracked with rainbow tables on a PC
Decrypting GSM phone calls Motivation. GSM telephony is the world’s most popular communication techn ...
- 【LeetCode OJ】Best Time to Buy and Sell Stock II
Problem Link: http://oj.leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/ We solve this prob ...
- C# 线程问题
一:概述和概念 C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行.一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为"主线程&quo ...
- 学习笔记:APP切图那点事儿–详细介绍android和ios平台
学习笔记:APP切图那点事儿–详细介绍android和ios平台 转载自:http://www.woofeng.cn/articles/168.html 版权归原作者所有 作者:亚茹有李 原文地址 ...