c++之内存管理
2014-02-04 22:37
288 查看
c++使用3种不同解决方案存储数据,区别是数据保留在内存中的时间
分为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;
}
/*
*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;
*/
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;
}
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/C++数据对齐详细解析
- C++中引用的使用总结
- C与C++之间相互调用实例方法讲解
- C++中引用(&)的用法与应用实例分析
- 解析C++ 浮点数的格式化输出
- 深入分析C++中几个最不常用的关键字
- c++中inline的用法分析
- 深入解析C++ Data Member内存布局
- 从汇编看c++中默认构造函数的使用分析
- 关于C++中的友元函数的一些总结
- C++的sstream标准库详细介绍
- 基于C++自动化编译工具的使用详解
- 浅谈C++中的string 类型占几个字节
- C/C++ 宏详细解析
- 深入分析C++中两个大数相乘结果不正确的问题
- 探讨C++中数组名与指针的用法比较分析
- 深入解析C++中的引用类型
- C++可变参数的实现方法
- C++中的常对象与常对象成员详解