开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 87|回复: 5
收起左侧

[讨论] 指针到非基础类型数据汇编版的疑惑

[复制链接]
结帖率:88% (7/8)
发表于 昨天 23:41 | 显示全部楼层 |阅读模式   江苏省常州市
VX图片_20260217234056.png
论坛里看到有这样一种写法实现指针到非基础类型,最近自己也在学习易语言的数据结构,感觉这样写绕过了编译器清理变量原始指针内存,会造成内存泄漏吧!
结帖率:88% (7/8)

签到天数: 12 天

 楼主| 发表于 6 小时前 高大上手机用户 | 显示全部楼层   江苏省常州市
帅气与大侠 发表于 2026-2-18 00:29
[e=1]
指针=取指针地址(自定义数据类型变量)_指针到数据(指针,数据类型)


受教了,感谢
回复 支持 反对

使用道具 举报

结帖率:100% (53/53)

签到天数: 17 天

发表于 6 小时前 | 显示全部楼层   福建省宁德市
  
指针=取指针地址 (自定义数据类型变量)_指针到数据 (指针,数据类型)
' 现在有多个问题
' 问题1:数据类型 这个变量,只要代码中引用了,就会为其分配内存
' 问题2:将[指针]给了[数据类型],此时:数据类型=自定义数据类型变量,但是[数据类型]这个变量的原始内存指针丢失了,内存泄漏!!!
' 问题3:当前子程序流程走完了,预编译过程会释放:[自定义数据类型变量]的内存,接着再释放[数据类型]的内存,但是两者内存地址一样的,释放了两次,那问题就大了,因为释放第二次的时候,这块内存不属于你了,这期间这块内存可能就被分配使用了,大概率崩溃。而且如果这个数据类型里有文本型、字节集这类非基础类型,这个概率会更大,因为释放内存的时候还会对数据里的成员内存进行释放
' 要解决这个问题,你的函数:_指针到数据() 必须要返回 [数据类型]这个变量的原始指针,在不用的时候,再次调用_指针到数据()进行还原
' 数据类型指针=_指针到数据(指针,数据类型)
' ...
' 不用时:_指针到数据(数据类型指针,数据类型)
' 这样形成闭环才可以
' 对于:文本型,只要显式的引用了这个变量,至少分配一个字节内存
' 对于:字节集,只要显式的引用了这个变量,至少分配8字节内存(这个内存有可能不是堆内存,可能是栈内存,没有测试过)
' 对于:数组,和字节集同理,但是数组会更复杂一些,根据数组维度和其它信息,分配的内存不一样,数组自身的内存好像还不是用的默认进程堆分配的,获取不到大小
白银大佬说了,绝大多数场景下不要用汇编来增加代码的不确定性,提升的那点性能在稳定性面前不值一提,除非是进行某算法用汇编


点评

不管指针的来源是变量获取的还是用的heapalloc分配的,不还原[数据类型]的源指针,都会内存泄漏,慢性和急性的区别,必须返回源指针进行恢复   福建省宁德市  发表于 6 小时前
回复 支持 反对

使用道具 举报

结帖率:88% (7/8)

签到天数: 12 天

 楼主| 发表于 6 小时前 高大上手机用户 | 显示全部楼层   江苏省常州市
cunanhai 发表于 2026-2-18 00:03
可能导致内存泄漏的场景
如果 [exp+0x0C] 指向的单元原本存储着一个指向动态内存的指针(例如通过 malloc  ...

ai可能了解得不够全面,这个是易语言程序代码。虽然eax最后是赋值了,但是子程序本身没有返回值,返回上层函数后不可能会清理原始变量内存,而且也说了传入的非基本数据类型,所以排除整数型这些。我能想到的就一种情况不会内存泄露,那就传入的参考类型没初始化过,但易语言子程序一开始就会初始化非基础数据类型的局部变量吧(猜的,还没去追踪调试过)?
回复 支持 反对

使用道具 举报

结帖率:95% (74/78)

签到天数: 16 天

发表于 6 小时前 | 显示全部楼层   河北省廊坊市
可能导致内存泄漏的场景
如果 [exp+0x0C] 指向的单元原本存储着一个指向动态内存的指针(例如通过 malloc 分配的内存地址),那么:

执行 pop dword [eax] 后,该单元被新值覆盖。

旧指针值被弹出到 eax 并返回给调用者。

此时,动态内存的引用被转移到了调用者手中。如果调用者忽略返回值,或没有在适当的时候释放它,这块动态内存将无法再被访问,从而造成内存泄漏。

反之,如果旧值不是动态内存的指针(例如普通整数、栈上变量的地址等),则没有泄漏风险。

结论
直接原因:代码本身不产生泄漏。

间接风险:依赖于上层对返回值(旧值)的处理方式以及该旧值的性质。若旧值是动态内存的唯一引用且未被释放,则泄漏会发生。


AI说的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表