1、新建一个动态数组
指针运算规则,a[1]等价于*(x+1)、a[2]等价于*(x+2),依次类推
把一个数组声明传递给new语句将使它返回一个该数组基类型的指针。
把数组下标操作符和该指针变量的名字搭配使用就可以像对待一个数组那样使用new语句为这个数组分配的内存块了。
例如:
int *x=new int[10];
可以像对待一个数组那样使用指针变量x:
x[1]=45;
x[2]=8;
当然,也可以用一个变量来保存该数组的元素个数:
int count=10;
int *x=new int[count]
2、删除一个动态数组
删除一个动态数组的具体做法是:
delete保留字的后面加上一对方括号:detelete[ ]x;
这样的做法可能挺奇葩,接下来的栗子给大家做下演示!
#include <iostream>
#include <string>
int main()
{
unsigned int count=0;
std::cout<<"请输入数组的元素个数:\n";
std::cin>>count;
int *x=new int[count];//分配动态内存空间
for(int i=0;i<count;i++)
{
x[i]=i;
}
for(int i=0;i<count;i++)
{
std::cout<<"x["<<i<<"]的值是:"<<x[i]<<std::endl;
}
return 0;
}
3、从函数或方法返回内存
动态内存的另一个常见用途是让函数申请并返回一个指向内存块的指针。掌握这个技巧很重要,尤其是在你打算使用由别人编写的库文件时。
#include <iostream>
#include <string>
int *newInt(int value) // 声明一个指针函数
{
int *myInt=new int;
*myInt = value;
return myInt;
}//定义指针函数,返回一个地址
int main()
{
int *x=newInt(20);
std::cout<<*x<<std::endl;
delete x;
x=NULL;
return 0;
}
结果
任何一个函数都不应该把自己的局部变量的指针作为它的返回值!因为局部变量存在栈里,函数结束时他会自动释放。
如果你想让一个函数在不会留下任何隐患的情况下返回一个指针,那它只能是一个动态分配的内存块的基地址。
复习一下函数指针和指针函数
函数指针:指向函数首地址的指针变量。
int (*x)(int a,int b);
指针函数:指针类型的函数,返回值为指针,即一个地址。
int *x(int a,int b);
3、副本构造器
—1–首先我们都知道,我们可以把一个对象赋值给一个类型与之相同的变量。
—2–编译器将生成必要的代码把“源”对象各属性的值分别赋值给“目标”对象的对应成员,这种赋值行为称之为逐位赋值。
–3—这种行为在绝大多数场合都没有问题,但是如果某些成员变量是指针的话,问题就来了:对象成员进行逐位复制的结果是你拥有两个一模一样的实例,而这两个副本里的同名指针会指向相同的地址。
于是呢,当删除其中一个对象时,它包含的指针也被删除,但万一此时另一个副本(对象)还在引用这个指针,就会出现问题!!!
因为CPU是逐条执行指令的,那么就有先后逻辑,当试图第二次释放同一块内存时,就肯定会导致程序崩溃!!!!!!!!!