动态内存分配

大多数情况下,当执行程序时,计算机中有部分未使用的内存。这些内存在C++中被称作堆,有时还被称为空闲存储器。使用new操作符可以在堆中为特定类型的新变量分配空间,预期配对的是delete操作符,其作用是释放先前new分配的内存。

我们可以在程序中为某些变量在堆中分配空间,当不再需要这些变量时,再将分配的空间释放并返回到堆中。这样在相同的程序的后面,这部分内存就可以被其他动态分配的变量重用。这种技术非常强大,使我们能够非常高效地使用内存,而且在许多情况下,使用这种技术的程序可以处理许多原本不可能处理的、实际大量数据的非常庞大的问题。

double* pvalue(nullptr);
pvalue = new double; //为double类型的变量分配内存,并在指针pvalue中存储地址
*pvalue = 9999.0; //通过指针引用double变量

系统或许没有分配我们请求的内存,原因可能是堆中的内存已经用完了,或者堆由于前面的使用而破碎,即没有足够的连续字节提供给需要获得空间的变量。此时new操作符会抛异常。

当然还可以这样创建变量:

pvalue = new double(9999.0); //创建变量的同时初始化
double* pvalue(new double(9999.0)); //创建指针并初始化
delete pvalue; //当不再需要动态分配的某个变量的时候,用delelte将其内存释放到堆中,以确保这块内存可以被另一个变量使用

如果不适用delelte,随后又在pvalue指针中存入一个不同的地址值,那么将无法再释放这块内存,或使用其包含的变量,因为我们失去了访问该地址的途径。这种情况被称为内存泄漏。

为数组动态分配内存也很简单:

pstr = new char[20]; //为20个字符的数组分配空间
delete [] pstr; //释放数组内存
pstr = nullptr; //将该指针重新设置成nullptr,确保不会试图访问已经删除的内存

同理,多维数组的动态内存分配:

pbeans = new double [3][4];
delete [] pbeans;
pbeans = nullstr;
posted @ 2013-11-11 22:40  jiangjiuwen  阅读(187)  评论(0编辑  收藏  举报