C++基础(十二)–用new动态创建一维数组

  • Post author:
  • Post category:其他


  • 普通数组在栈上分配内存,栈很小;如果需要存放更多的元素,必须在堆上分配内存。动态数组的意义就是如果要处理大量的数据,必须在堆上分配内存。
  • 动态创建一维数组的语法:数据类型* 指针=new 数据类型[数据长度]。int* arr = new int[8];
  • 释放一位数组的语法:delete[] 指针。delete arr;

    // PointerTest12.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <string>
    #include <iostream>
    using namespace std;
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int* arr = new int[8];
    	for (int i = 0; i < 8; i++)
    	{
    		arr[i] = 100 + i;									//数组表示法
    		cout << "arr[" << i << "]=" << *(arr + i) << endl; //指针表示法
    	}
    	delete[] arr;
    	system("pause");
    	return 0;
    }
    
    

  • 注意:

    (1)普通数组有数组名,可以用sizeof运算符运算得得整个数组占用内存空间的大小,但是动态创建的数组没有数组名,只有一个指针,不能用sizeof运算符

    (2)可以用数组表示法和指针表示法两种方式使用动态创建的数组。

    (3)必须使用delete[]来释放动态数组的内存,不能只用delete,如果只用delete,释放的就只是第0个元素的内存空间,而不是整个数组。

    (4)不一样delete[]来释放不是new[]分配的内存(C语言的malloc函数也可以动态分配内存,malloc分配的内存要用free()函数来释放,不能用delete)

    还有,如果指针指向的地址是栈上的变量,也就是普通变量的地址,也不能用delete来释放,否则会引发异常。

    (5)不要用delete[]释放同一块内存两次,否则等同于操作野指针。(delete释放内存之后,不会把指针置空,释放一次就行了,第二次就是在操作野指针)

    (6)空指针用delete[]是安全的,所以释放内存后,应该把指针置空nullptr,这样可以防止误操作。

    (7)声明普通数组的时候,数组长度可以用变量,相当于在栈上动态创建数组,并且不需要释放。(在实际开发中,如果数组很小,使用栈内存也是可以的,很安全很方便)

    (8)如果内存不足,调用new会产生异常,导致程序中止;如果在new关键字后面加(std::nothrow)选项,则返回nullptr,不会产生异常。

    
    	//在栈上分配内存
    	/*
    		int a[1000001];//当在栈上申请较大的数组时,会导致栈溢出,此行代码会导致栈溢出
    		a[1000000] = 8;
    	*/
    
    	//在堆上分配内存,动态创建一维数组
    	//老师的教程里此处是想模拟内存不够时的情景,但是我这里总是在提示“数组的总大小不得超过 0x7fffffff 字节”,所以我没有模拟到内存不够的情况,但是思路是跟着老师来的
    	int *Arr = new(std::nothrow) int[100000001];//内存不够时会导致程序崩溃,为了防止程序崩溃,在new关键字后面加(std::nothrow),如果内存不够,则返回nullptr,然后再做判断
    	if (Arr = nullptr)
    	{
    		cout << "分配内存不足" << endl;
    	}
    	else
    	{
    		Arr[100000000] = 10;
    	}

    (9)为什么用delete[]释放数组的时候,不需要指定数组的大小?因为系统会自动跟踪已分配数组的内存



版权声明:本文为weixin_43443648原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。