/**
* 测试动态数组
*/
#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; // 释放内存
}
动态数组
最新推荐文章于 2023-08-15 09:21:44 发布