c++之内存管理

标签: 内存管理 | 发表时间:2014-02-05 06:37 | 作者:ztk881012
出处:http://blog.csdn.net

c++使用3种不同解决方案存储数据,区别是数据保留在内存中的时间

1.自动存储持续性

两种存储持续性为自动:自动变量和寄存器变量(register没有内存地址)(堆栈)

2.静态存储持续性

在函数外定义的变量和使用关键字static定义的变量的存储持续性都为静态.

分为3种链接性:

外部链接性,内部链接性和无链接性

所有静态变量都有下面的两个初始化特征:

1.未被初始化的静态变量的所有位数都被设置成0

2.只能使用常量表达式来初始化静态变量

对于链接性为外部的变量,有且只有一个文件中包含了该变量的外部定义。其他文件要引用该变量,必须在引用声明中使用关键字extern

#include <iostream>
//全局变量
using namespace std;
int globle = 10;//定义
int ab(int a,int b,int*p)
{
        //extern int globle;//引用
        int globle = 20;
        cout<<"globle = "<<::globle<<endl;//::使用全局版本
        *p =a-b;
        return a+b;
}

 

存储描述 持续性 作用域 链接性 如何声明
自动 自动 代码块 在代码块中声明(可使用关键字auto)
寄存器 自动 代码块 在代码块中使用关键字register
静态,无链接性 静态 代码块 在代码块中使用关键字static
静态,外部链接性 静态 文件 外部 在函数外部
静态,内部链接性 静态 文件 内部 在函数外部使用关键字static



  1. /* 
  2.  *C++的存取修饰符 
  3.  *主要有:const--常数型,volatile--暂态型 
  4.  *1.const--常数型 
  5.  *const型变量在程序执行期间是不可以改变的,编译程序可以随意的将这些变量放到只读存储器Rom中 
  6.  *const用途:可以阻止参数被修改,即当一个指针传送给一个函数后,函数可能修改该指针所指向的变量,然而,如果指针在参数说明段 
  7.  *用const修饰,函数就无法修改指针所指的内容了。 
  8.  *通常,当一个标准库函数不必修改调用参数指引的对象时,参数则用const来修饰, 
  9.  *2.volatile 
  10.  *volatile通知编译器:变量值可能由程序中没有显示说明的方式所改变。 
  11.  *全局变量的地址可能被传递到操作系统的时针子程序,用来保存系统实时时间。 
  12.  *引用修饰符volatile的原因:大多数C编译程序都假定表达式内部的内容不变,并以这一假定来自动优化某些表达式。 
  13.  *有些编译程序都假定表达式内部的内容不变,并以这一假定来自动优化某些表达式。有些编译程序在编译时还有改变表达式的计算顺序,volatile 
  14.  *可以防止这些改变发生。 
  15.  *const 和volatile可以一起使用,例如:如果假定0x80是仅由外部条件改变的端口的值,那么下面说明既可以消除用户希望防止的说有偶发副作用: 
  16.  *const volatile unsigned char * port=0x80; 
  17. */ 


3.动态存储持续性

用new操作符分配的内存将一直存在,直到使用delete操作符将其释放或程序终止


placement new操作符:


#include <iostream>
#include <new>//1.引入new头文件
const int BUF = 512;
const int N = 5;
char buffer[BUF];//2.
int main()
{
	using namespace std;
	double * pd1,* pd2;
	cout<<"Calling new and placement new:\n";
	pd1 = new double[N];//
	pd2 = new (buffer) double[N];//3.定义
	for (int i =0 ;i<N;i++)
		pd2[i]=pd1[i] = 1000+20.0*i;
	cout<<"Buffer address:\n"<<"heap: "<<pd1<<" static: "<<(void*)buffer<<endl;
	cout<<"Bugger contents:\n";
	for (int i=0;i<N;i++)
	{
		cout<<pd1[i]<<" at "<<&pd1[i]<<" ; ";
		cout<<pd2[i]<<" at "<<&pd2[i]<<endl;
	}
	double *pd3,*pd4;
	pd3 = new double[N];
	pd4 = new (buffer) double[N];
	for (int i=0;i<N;i++)
		pd4[i]=pd3[i]=1000+20.0*i;
	cout<<"Buffer contents:\n";
	for (int i=0;i<N;i++)
	{
		cout<<pd3[i]<<" at "<<&pd3[i]<<" ; ";
		cout<<pd4[i]<<" at "<<&pd4[i]<<endl;
	}
	delete []pd1;
	delete []pd3;
	//delete pd2; 报错 布局new不能使用delete
	system("pause");
	return 0;
}



作者:ztk881012 发表于2014-2-4 22:37:05 原文链接
阅读:0 评论:0 查看评论

相关 [内存管理] 推荐:

Android内存管理

- - CSDN博客推荐文章
首先Android内存管理机制相当复杂,想要讲清楚比较困难;其次对于绝大多数用户来说,只关心内存够不够用,至于内存如何管理的这种技术细节,不是用户需要去考虑的,写这样一个专题有没有意义. 毕竟我们是用手机,不是来研究手机的. 最后的顾虑是这个专题会不会太技术化了,绝大部分用户不会看或者说缺乏相应的背景.

Sun JDK 1.6内存管理

- 小丑鱼 - 淘宝JAVA中间件团队博客
分为使用篇、调优篇和实现篇三个部分,使用篇为填鸭式,调优篇为pattern式,实现篇为启发式,三个PPT的目标为:. 1.掌握Sun JDK的内存区域的划分;. 2.掌握Sun JDK垃圾收集器的使用方法和触发时机;. 4.掌握一些基本的GC调优的方法;. 5.了解自动内存管理的常见实现方法,以及Sun JDK所做的优化.

Android内存管理之道

- - CSDN博客移动开发推荐文章
相信一步步走过来的Android从业者,每个人都会遇到OOM的情况. 如何避免和防范OOM的出现,对于每一个程序员来说确实是一门必不可少的能力. 今天我们就谈谈在Android平台下内存的管理之道,开始今天的主题之前,先再次回顾两个概念. 内存泄漏:对象在内存heap堆中中分配的空间,当不再使用或没有引用指向的情况下,仍不能被GC正常回收的情况.

c++之内存管理

- - CSDN博客推荐文章
c++使用3种不同解决方案存储数据,区别是数据保留在内存中的时间. 两种存储持续性为自动:自动变量和寄存器变量(register没有内存地址)(堆栈). 在函数外定义的变量和使用关键字static定义的变量的存储持续性都为静态.. 外部链接性,内部链接性和无链接性. 所有静态变量都有下面的两个初始化特征:.

[译] HotSpot JVM 内存管理

- - IT瘾-dev
HotSpot JVM 内存管理. 更新时间:2018-03-28. 关于 JVM 内存管理或者说垃圾收集,大家可能看过很多的文章了,笔者准备给大家总结下. 这算是系列的第一篇,接下来一段时间会持续更新. 本文主要是翻译《 Memory Management in the Java HotSpot Virtual Machine》白皮书的前四章内容,这是 2006 的老文章了,当年发布这篇文章的还是 Sun Microsystems,以后应该会越来越少人记得这家曾经无比伟大的公司了.

Memcached内存管理机制浅析

- 圣斌 - basic coder
Memcached的内存管理在网上也可以搜集到不少不错的文章,新浪的这篇《Memcached深度分析》讲得不错,读别人的文章还是不如自己直接去读源码分析源码来得直接,这里写一下我阅读Memcached源码时对于Memcached内存管理机制的理解. Memcached的代码结构很简单,从main()函数入口进去之后便是几个模块的初始化函数,和内存管理相关的主要有两个函数,一个是assoc_init(),这个是用来初始化哈希表的,关于这个哈希表的作用留在外面讨论,另一个是slabs_init(),该函数用来初始化slab,下面先来讨论一下slab机制.

JVM内存管理学习总结(一)

- - CSDN博客互联网推荐文章
I.JVM进程的生命周期. JVM实例的生命周期和java程序的生命周期保持一致,即一个新的程序启动则产生一个新的JVM进程实例,程序结束则JVM进程实例伴随着消失. 那么程序启动和程序终止就是JVM实例生命周期的两个边界,两个边界点可以这么理解:一个拥有程序入口(main函数)的class在执行main方法时,相应的JVM就被创建了(即JVM生命周期的起点),当由此main函数启动的所有非守护线程都终止时,JVM即退出(JVM实例生命周期的终点).

[原]GC与显式内存管理

- - Dev in Nightmare
    C++复兴的话题至今已被鼓吹两年有余,Herb Sutter和Bjarne Stroustrup等大牛们也为C++带来了大步伐的革新. 然而,从这两年的效果而言,C++的复兴并没有发生. 一方面随着世界经济的动荡,IT行业也出现了一定程度的衰退;另一方面这也是个新兴语言如雨后春笋的时代,尤其是web平台上,CoffeeScript、Dart、TypeScript等,新人阶前花更红.

Android内存管理哪些事

- - 移动开发 - ITeye博客
上一篇文章总结了一下内存分析的方法,这次聊聊如何出现解决和避免内存相关的问题.  你的应用到底有多少的heapsize可以通过:  . 来获取(注意,这里的单位是K). 我测试了几个手机,Galaxy nexus 可以申请到256M的heapsize,256M啊,同学们,这是多么的奢侈啊,但是人家谷歌说的很清楚,用这个标签一定要慎重,除非你是真的需要这么多内存,不能把这玩意作为快速解决OOM的手段,如果你的内存使用过多,还是先慎重的分析一下你的内存到哪里去了,因为这会导致GC的时间较长并且会影响系统的性能,原文如下:.

java内存管理【转】权威

- - 互联网 - ITeye博客
  说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物. 事实上,GC的历史远远比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言. 当Lisp还在胚胎时期时,人们就在思考:.    GC需要完成的三件事情:.