(10 )使用new创建动态内存结构 int main()
{
char* name ;
name = getname();
cout << name << "at"<<(int *)name<<endl;
delete [] name ;
name = getname();//name指针指向返回值的首地址,即pn指针释放,name指针重新指向该内存
cout << name << "at"<<(int *)name<<endl;//cout函数在对于地址输出是按照字符串形式输出。
//把name指向(char *)的地址值强制转化为(int *)输出,说明此时地址也是按照字符串形式储存。
delete [] name ;//当指针指向一个地址,释放时无需加[],否则指向多个地址时需加[]
system("pause");
return 0 ;
}
char * getname()
{
char temp[80]; //找出姓名最大长度,作为数组长度。
cout << "enter your last name !"<<endl;
cin>>temp;
char *pn = new char[strlen(temp)+1];//在运行阶段,分配最佳适合内存,+1 为空字符结束标志
//为什么两次调用函数时pn的地址值都是一样的啊?应当每次都是随机从新分配内存啊?
strcpy(pn,temp);//字符串复制
return pn;//返回pn的首地址,结束调用。此时分配的内存并未被释放掉,因而依然存在,且有值。
//只是由于调用结束,pn指针被释放,显示未定义的变量。
} (11)自动存储,静态存储,动态存储 自动存储:自由变量,函数被调用时自动产生,在该函数结束时消亡。如上例中 temp[80],调用结束消亡,这就是要用new的原因。(局部变量,代码块) 静态存储:整个程序执行过程期间都存在的存储方式。(函数外面定义它 , 或者 声明变量时使用关键字static ) 动态存储:自由存储空间。可以再一个函数中分配内存,在一个函数中释放,程序员有更大的控制权。 (12)堆,栈,内存泄露 泄露:如果没有delete,则即使包含指针的内存由于作用域规则和对象生命周期的原因而被释放,在自由存储空间上动态分配的变量或结构也将继续存在, 实际上,将无法访问自由存储空间的内存,因为指向这些内存的指针无效,导致内存泄露。 影响:a.内存在程序的整个生命周期不能使用,即被分配出去,但是无法收回。 b.极端情况将导致内存被耗尽,导致程序错误。 c.给一些操作系统或者相同内存空间中运行的一些应用程序带来负面影响,导致相应崩溃。 |