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

  • 普通数组在栈上分配内存,栈很小;如果需要存放更多的元素,必须在堆上分配内存。动态数组的意义就是如果要处理大量的数据,必须在堆上分配内存。
  • 动态创建一维数组的语法:数据类型* 指针=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[]释放数组的时候,不需要指定数组的大小?因为系统会自动跟踪已分配数组的内存
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值