c++,关于指针,引用和new,如图? 200

书上定义了指针却未初始化就赋值,说是隐藏了new,指针是函数的局部变量,为什么结束后不释放内存,这个函数是如何运作的呢?... 书上定义了指针却未初始化就赋值,说是隐藏了new,指针是函数的局部变量,为什么结束后不释放内存,这个函数是如何运作的呢? 展开
 我来答
CodeBlove
2022-01-10 · TA获得超过3363个赞
知道小有建树答主
回答量:936
采纳率:79%
帮助的人:236万
展开全部

首先书上应该是印刷错误,传参不应该是引用才会有new的效果,用引用的话返回的还是原结构体的地址。


传递的结构时,编译器会在栈上分配一个能容纳这个结构体的空间,并复制结构体所有成员的值,只能说效果相当于new了一个临时结构体,但是还是有区别的,new是分配在堆上的,不会被栈数据覆盖掉,而且需要主动delete,除非整个程序退出才会被系统回收。然而这个内存块是通过压栈的方式创建的,函数返回的是栈上的临时地址,函数退出后通过退栈送到EAX寄存器并赋值给外部变量。由于发生了退栈,此时该临时结构体处于栈自由空间,实际上已经释放了,随时可能会被覆盖掉,因此叫做无名结构体,实际上就是内存泄漏,这种情况下外部变量很容易成为野指针。


我认为根本不是忘不忘的问题,而是这种代码完全是存在潜在风险的,根本不会这么写,函数内分配在栈上数据都会因为函数退出而释放,根本不需要主动delete。所以我认为写书的人耍技巧但又没说明这种写法的危险性,而且本质上根本不是new不需要释放。


我在Clone里面对a做了+1操作,以说明函数内的对象是个临时结构体。右边是输出结果,注意函数形参不是引用,另外函数内赋值给p的时候需要加个&以取地址。

再说一遍,这种写法是不规范的,纯属投机取巧,可读性差,真正项目根本不会这么写,时间长了自己都看不懂。

microroom
科技发烧友

2022-01-10 · 智能家居/数码/手机/智能家电产品都懂点
知道大有可为答主
回答量:7118
采纳率:83%
帮助的人:1541万
展开全部
这个代码有问题,因为指针未初始化就赋值了。

正常的代码应该是这样的:
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);
否则会报错。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式