C++中的内存管理
例如:
在 C++语言中,可以使用 new 操作符灵活自由地申请特定大小的内存资源供程序使用,同时又可以利用指向这些内存资源的指针方便地在函数间进行传递,在提高程序性能的同时也增加了程序的灵活性。
#include <iostream>
#include <fstream>
using namespace std;
// 将指针所指向的内存位置上的数据写入文件
bool WriteToFile(const int* pScore,const unsigned int nCount)
{
ofstream out("data.txt"); // 打开输出文件
if(!out.is_open()) // 如果文件打开失败
return false;
// 通过指针直接访问它所指向的内存位置上的数据
for(unsigned int i = 0; i < nCount; ++i)
{
out<<*pScore<<endl; // 直接读取内存位置上的数据并输出
++pScore; // 指向下一个数据所在的位置
}
out.close();
return true;
}
int main()
{
while(true) // 构造输入输出无限循环
{
unsigned int N = 0; // 数据个数
cout<<"请输入数据个数: ";
cin>>N;
// 数据个数为 0,循环结束
if(0 == N)
break;
// 根据需要动态地申请内存资源,得到的指针指向这块内存资源的首地址
int* pScore = new int[N];
for(unsigned int i = 0;i < N; ++i)
{
cout<<"请输入第"<<i+1<<"个数据: ";
// 通过指针将输入的数据直接写入相应的内存位置
cin>>*pScore;
++pScore; // 指向下一个内存位置
}
pScore -= N; // 调整指针指向,将其重新指向内存资源的首地址
// 将指针指向的内存块上的数据写入文件
WriteToFile(pScore,N);
}
return 0;
}
-
在main()函数的输入输出无限循环中,我们根据用户输入的所需要保存数据的个数 N,用 new操作符动态地申请了可以保存 N 个 int 类型数据的内存资源。同时,让 pScore 指针指向这块内存资源。
-
然后,在 main()函数中,我们通过 pScore 指针将用户输入的数据直接写入它所指向的内存位置( cin>>*pScore)完成数据的输入。
-
接着,我们将 pScore 指针重新指向这块内存的起始位置( pScore-= N),并将它传递给WriteToFile()函数。而在这个函数中,我们又同样通过 pScore 指针参数直接读取内存中的数据写入到 ofstream 对象( out<<*pScore)完成数据的输出。
由于上述程序被反复多次的执行,程序所占用的内存资源越来越多,最后可能导致系统内存资源耗尽。
C++中对内存资源的使用,我们既要负责申请,又要在使用完毕后负责释放,两者是一一对应的。
编程序可能遇到的两个问题:
-
申请的内存资源在使用完毕后没有及时释放产生内存泄漏,最后不断累积可能导致系统内存资源耗尽。上面的代码就是一个典型的内存泄漏的例子。
-
与申请的内存忘了释放而导致的内存泄露相对应的还有另外一种情况,那就是一个内存资源有可能被重复释放两次,或者是虽然内存资源已经被释放,但指向这块内存资源的指针依然存在,那么就有可能通过这个指针访问到已经被释放的内存资源,从而导致严重的内存访问错误。
解决方案见下一篇博客-智能指针