您的位置:首页 > 编程语言 > C语言/C++

c++之内存管理

2014-02-04 22:37 288 查看
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
/* 

 *C++的存取修饰符 

 *主要有:const--常数型,volatile--暂态型 

 *1.const--常数型 

 *const型变量在程序执行期间是不可以改变的,编译程序可以随意的将这些变量放到只读存储器Rom中 

 *const用途:可以阻止参数被修改,即当一个指针传送给一个函数后,函数可能修改该指针所指向的变量,然而,如果指针在参数说明段 

 *用const修饰,函数就无法修改指针所指的内容了。 

 *通常,当一个标准库函数不必修改调用参数指引的对象时,参数则用const来修饰, 

 *2.volatile 

 *volatile通知编译器:变量值可能由程序中没有显示说明的方式所改变。 

 *全局变量的地址可能被传递到操作系统的时针子程序,用来保存系统实时时间。 

 *引用修饰符volatile的原因:大多数C编译程序都假定表达式内部的内容不变,并以这一假定来自动优化某些表达式。 

 *有些编译程序都假定表达式内部的内容不变,并以这一假定来自动优化某些表达式。有些编译程序在编译时还有改变表达式的计算顺序,volatile 

 *可以防止这些改变发生。 

 *const 和volatile可以一起使用,例如:如果假定0x80是仅由外部条件改变的端口的值,那么下面说明既可以消除用户希望防止的说有偶发副作用: 

 *const volatile unsigned char * port=0x80; 

*/ 

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
;//
pd2 = new (buffer) double
;//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
;
pd4 = new (buffer) double
;
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++ 内存管理