动态内存管理与动态数组的使用

来源:互联网 发布:网络分线盒多少钱 编辑:程序博客网 时间:2024/05/22 14:19

之前看了小甲鱼的视频,了解了这部分的内容,今天将它们整理一下。

动态内存支持程序猿创建和使用种种能够根据具体需要扩大和缩小的数据结构,它们只受限于计算机的硬件内存总量和系统特殊约束。

动态内存由一些没有名字、只有地址的内存块构成,那些内存块是在程序运行期间动态分配的。

它们来自一个由标准 C++ 库替你管理的”大池子”(”内存池”),从内存池申请一些内存需要用 new 语句,它将根据你提供的数据类型分配一块大小适当的内存。

你不必担心内存块的尺寸问题,编译器能够记住每一种数据类型的单位长度并迅速计算出需要分配多少个字节。如果有足够的可用内存能满足你的申请,new 语句将返回新分配地址块的起始地址。

如果没有足够的可用内存空间?那么 new 语句将抛出 std::bad_alloc 异常!

注意在用完内存块之后,应该用 delete 语句把它还给内存池。

另外作为一种附加的保险措施,在释放了内存块之后还应该把与之关联的指针设置为NULL

图说编程:

int *i = new int;


delete i;   //此时指针仍然指向原来的地址


i = NULL;//特殊的地址值—NULL指针,此时指针将不再指向任何东西


静态内存意思是指内存块的长度在程序编译时被设定为一个固定的值,而这个值在程序运行时是无法改变的。

new 语句返回的内存块很可能充满”垃圾”数据,所以我们通常先往里边写一些东西覆盖,再访问它们,或者在类直接写一个构造器来初始化。

在使用动态内存时,最重要的原则是每一条 new 语句都必须有一条与之配对的 delete 语句,没有配对的 delete 语句或者有两个配对的 delete 语句都属于编程漏洞。(尤其前者,将导致内存泄漏)

在重新使用某个指针之前千万不要忘记调用 delete 语句,如果不这样做,那个指针将得到一个新内存块的地址,而程序将永远也无法释放原先那个内存块,因为它的地址已经被覆盖掉了。 

请记住,delete 语句只释放给定指针变量正指向的内存块,不影响这个指针。在执行 delete 语句之后,那个内存块被释放了,但指针变量还依然健在哦。

 

 

动态数组:

把一个数组声明传递给 new 语句将使它返回一个该数组基类型的指针。

把数组下标操作符和该指针变量的名字搭配使用就可以像对待一个数组那样使用 new 语句为这个数组分配的内存块了。

 

例如:

int *x = new int[10]; 

可以像对待一个数组那样使用指针变量 

x[1] = 45;

x[2] = 8; 

当然,也可以用一个变量来保存该数组的元素个数:

//应用比较多的动态数组声明方法

int count = 10;

int *x = new int[count];

 

删除一个动态数组   delete [ ] x;

 

删除一个动态数组要比删除其他动态数据类型稍微复杂一点。因为用来保存数组地址的变量只是一个简单的指针,所以需要明确地告诉编译器它应该删除一个数组!

具体的做法是在 delete 保留字的后面加上一对方括号:delete [] x;

<span style="font-size:18px;">int main(){   unsigned int count = 0;   cout << "请输入数组的元素个数:\n";   cin >> count;    int *x = new int[count];   for (int i = 0; i < count; i++)   {      x[i] = i;   }   for (int i = 0; i < count; i++)   {      cout << "x[" << i << "]的值是:" << x[i] << endl;   }   return 0;}</span>



1 0