动态数组

/**
 * 测试动态数组
 */
#include <iostream>
#include <string>
#include <vector>

using namespace std;

unsigned int get_size(){
	return 5;
}


void test_4(){
	/*
	用 new 动态创建长度为 0 的数组时,new 返回有效的非零指针。该指针与
	new 返回的其他指针不同,不能进行解引用操作,因为它毕竟没有指向任何元素。

	而允许的操作包括:比较运算,因此该指针能在循环中使用;在该指针上加(减)
	0;或者减去本身,得 0 值。

	在上述例题中,如果 get_size 返回 0,则仍然可以成功调用 new,但是 p
	并没有指向任何对象,数组是空的。因为 n 为 0,所以 for 循环实际比较的是
	p 和 q,而 q 是用 p 初始化的,两者具有相等的值,因此 for 循环条件不成
	立,循环体一次都没有执行。
	*/
	int arr_1[0];
	int *pArray = new int[0];

	delete [] pArray;
}

//const的动态数组:用得很少
//必须为这个数组提供初始化:因为数组元素都是 const 对象,无法赋值。
//对于类类型的const动态数组,该类类型必须提供默认构造函数
void test_3(){
	//error: uninitialized const in 'new' of 'const int'
	//const int *pBad = new const int[10];

	//ok
	const int *pGood = new const int[10]();
	delete [] pGood;
}


//对于动态分配的数组,其元素只能初始化为元素类型的默认值,而不能像数组变量一样,用初始化列表为数组元素提供各不相同的初值。
void test_2(){
	int size = get_size();
	int *p = new int[size]();	// 推荐使用这种方式初始化数组,如果是类类型则会默认调用该类类型的默认的构造函数

	for( int *p_begin = p, *p_end = p_begin + size; p_begin != p_end; ++p_begin ){
		cout << *p_begin << "_";	// 0_0_0_0_0_
	}
	cout << endl;

	delete [] p;
}

// 动态创建数组,并循环数组
void test_1(){
	int *p = new int[get_size()];
	int i = 0;
	int *p_begin = p;

	for( int *p_end = p_begin + get_size(); p_begin != p_end; ++p_begin ){
		*p_begin = i;
		i++;
	}

	for( int *p_end = p + get_size(); p != p_end; ++p ){
		cout << *p << "_";	// 0_1_2_3_4_
	}

	cout << endl;
	/*
	delete 和指针之间的空方括号对是必不可少的:它告诉编译器该指针指向
	的是自由存储区中的数组,而并非单个对象。
	如果遗漏了空方括号对,这是一个编译器无法发现的错误,将
	导致程序在运行时出错。

	理论上,回收数组时缺少空方括号对,至少会导致运行时少释放了内存空间,
	从而产生内存泄漏(memory leak)。对于某些系统和/或元素类型,有可能会带
	来更严重的运行时错误。因此,在释放动态数组时千万别忘了方括号对。
	*/
	delete [] p;	// 释放内存
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值