c++,关于指针,引用和new,如图? 200
首先书上应该是印刷错误,传参不应该是引用才会有new的效果,用引用的话返回的还是原结构体的地址。
传递的结构时,编译器会在栈上分配一个能容纳这个结构体的空间,并复制结构体所有成员的值,只能说效果相当于new了一个临时结构体,但是还是有区别的,new是分配在堆上的,不会被栈数据覆盖掉,而且需要主动delete,除非整个程序退出才会被系统回收。然而这个内存块是通过压栈的方式创建的,函数返回的是栈上的临时地址,函数退出后通过退栈送到EAX寄存器并赋值给外部变量。由于发生了退栈,此时该临时结构体处于栈自由空间,实际上已经释放了,随时可能会被覆盖掉,因此叫做无名结构体,实际上就是内存泄漏,这种情况下外部变量很容易成为野指针。
我认为根本不是忘不忘的问题,而是这种代码完全是存在潜在风险的,根本不会这么写,函数内分配在栈上数据都会因为函数退出而释放,根本不需要主动delete。所以我认为写书的人耍技巧但又没说明这种写法的危险性,而且本质上根本不是new不需要释放。
我在Clone里面对a做了+1操作,以说明函数内的对象是个临时结构体。右边是输出结果,注意函数形参不是引用,另外函数内赋值给p的时候需要加个&以取地址。
再说一遍,这种写法是不规范的,纯属投机取巧,可读性差,真正项目根本不会这么写,时间长了自己都看不懂。
正常的代码应该是这样的:
free_throws *pt=new free_throws;
*pt=ft;
return *pt;
所谓隐藏了new是指new是在这个函数内部进行的,外部看不到。
因为new申请的是动态内存,退出函数后内存不会自动释放,要释放得手动用delete &jolly;,所以很容易忘记释放。
这个函数的作用就是拷贝参数ft表示的结构体变量到动态内存中,然后返回这个拷贝的常量左值引用。
此外,free_throws & jolly=clone(three);
应该改成
const free_throws & jolly=clone(three);
否则会报错。