程序的运行

来源:互联网 发布:java高级工程师培训 编辑:程序博客网 时间:2024/06/14 03:28

到目前为止使用的所有变量在本教程中有一个共同点:在编译时必须声明的变量。这将导致两个问题:第一,很难有条件地声明一个变量,把它以外的在if语句块(在这种情况下它将走出范围块结束时)。其次,所有数组的大小必须提前决定程序的运行。例如,以下是不合法的:

然而,在许多情况下,这将是有用的能够大小或调整数组在程序运行。例如,我们可能想要使用一个字符串保存人的名字,但是我们不知道他们的名字,直到他们进入多久。或者我们可能需要从磁盘读取的记录,但我们不知道有多少记录。或者我们可以创建一个游戏,一个变量数量的怪物追逐的球员。

如果我们有要申报的大小在编译时的一切,最好的我们能做的就是尽量猜测变量的最大数量我们需要和希望就足够了:

1
2
3
charszName[25]; // let's hope their name is less than 25 chars!
Record asRecordArray[500]; // let's hope there are less than 500 records!
Monster asMonsterArray[20]; // 20 monsters maximum

这是一个贫穷的解决方案有几个原因。首先,它会导致浪费内存,如果变量没有实际使用。例如,如果我们分配25字符每一个名字,但是名字平均只有12个字符长,我们分配我们真正需要两倍多!第二,它会导致人工限制和/或缓冲区溢出。当用户试图从磁盘读入600条记录吗?因为我们只安排500空间,我们必须给用户一个错误,只读第一个500条记录,或者(在最坏的情况下,我们不处理这种情况下),我们溢出缓冲区和记录程序崩溃。

幸运的是,通过动态内存分配这些问题很容易解决。动态内存分配允许我们分配内存的大小我们希望当我们需要它。

动态分配单一变量

动态地分配一个变量,我们使用标量(非数组)形式的新的操作符:

1
int*pnValue = newint;// dynamically allocate an integer
新的操作符返回的地址变量被分配。这个地址可以存储在一个指针,指针可以访问该变量的引用。

因为我们是分配一个数组,c++知道它应该使用数组的新版本而不是标量的新版本。从本质上讲,新[]操作符,即使旁边的[]不放置新的关键词。

当删除一个动态分配的数组,我们必须使用数组的版本删除,删除[]。这告诉CPU,它需要清理多个变量,而不是一个变量。

注意数组访问相同的方式完成与动态分配的数组与普通数组。虽然这看起来有点滑稽,鉴于pnArray是显式地声明为指针,记住,只是指针数组在c++中。

最常见的错误之一,新程序员在处理动态内存分配时使用删除而不是删除[]删除一个动态分配的数组。不要这样做!上使用的标量版本删除数组会导致数据损坏或其他问题。

内存泄漏

动态分配的内存没有有效范围。也就是说,它停留,直到显式分配或分配,直到项目结束。然而,用于访问动态分配的内存的指针遵循正常的范围规则变量。这种不匹配可以创建有趣的问题。


0 0