new delete 详解
实验1
int **all_a = new int* [2]; // 申请了一片空间足够存储两个int类型指针。// 返回对象是指向空间头的指针,因此是int**int* a = new int [3];//申请了足够存储3个int 的空间,返回空间开始位置的指针 int* b = new int [3];//申请了足够存储3个int 的空间,返回空间开始位置的指针 all_a[0] = a;//all_a[0] 是为指针变量保留的空间,值为一个指针变量all_a[1] = b;//all_a[1] 是为指针变量保留的空间,值为一个指针变量cout<<all_a[0]<<" "<<all_a[1]<<endl;// 0x55555556aed0 0x55555556aef0//注意,这里输出的是两个指针的值 对应a bcout<<&all_a[0]<<" "<<&all_a[1]<<endl;// 0x55555556aeb0 0x55555556aeb8//输出a b这两个指针变量 被存储在的空间地址//指针变量32位,占据空间为8 个字节,所以两个指针变量存储的地址差8cout<<all_a<<" "<<all_a+1<<endl;//这个语句和上面是等价的// 0x55555556aeb0 0x55555556aeb8
实验2
int **all_a = new int* [2];int* a = new int [3];int* b = new int [3];all_a[0] = a;all_a[1] = b;delete[] a;delete[] b;delete[] all_a;
// delete all_a;这么写是错误的!!!因为 all_a是一个指针数组,必须按照指针数组的方式来释放空间。return 1;
}
实验3
int **all_a = new int* [2];int* a = new int [3];int* b = new int [3];all_a[0] = a;all_a[1] = b;delete[] a;delete[] b;delete &all_a[1];//本意:既然all_a 分配了足够存储 两个指针变量的空间, 那么释放的时候,是否允许只释放一个指针变量的空间,保留另外一个呢?//运行结果:invalid pointer//结论:不允许!!!return 1;
}
实验4
char* a = new char[10];//这里连续分配了10个char变量的空间,是否可以只释放一个char变量的空间呢?delete (a+3); //释放第四个char变量的空间//运行结果:invalid pointer//结论:不允许!!!return 1;