c++之内存管理

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;
}



c++之内存管理

上一篇:C++函数


下一篇:关于CSS样式