明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 361|回复: 1

[运行时] cad.net 内存泄露

  [复制链接]
发表于 2024-12-11 04:05:00 | 显示全部楼层 |阅读模式
本帖最后由 你有种再说一遍 于 2024-12-17 03:50 编辑

上一篇我们学习了链式调用Linq并行操作,
其实链式调用其实很容易引起内存泄露.
现代编程除了链式编程,还有智能指针,在c#就是using来操控.

good:
using var reg = regedit.CreateSubKey("AcDim");
var n = reg.GetNames();
using var reg2 = regedit.CreateSubKey("AcDim2");
n = reg2.GetNames();

bad:
var n = regedit.CreateSubKey("AcDim").GetNames();

bad:
using var reg = regedit.CreateSubKey("AcDim");
var n = reg.GetNames();
reg = regedit.CreateSubKey("AcDim2");
n = reg.GetNames();

CAD上面Linq打开图元,
方案三就是一个错误案例,
方案四就是有名函数注意了释放顺序.
https://www.cnblogs.com/JJBox/p/16002267.html#_label3_0_0_0

bad:
.Select(btrId => (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead)) // 这里无法using对象

即使串行遍历,那么所有的tr.GetObject都需要using的!!
用新语法using,并且每个tr.GetObject前面都要,
using的对象如果是加入数据库,cad会自动处理的,不会被释放,原理cad会用ent.IsNewObject指针来决定释放.
using的对象如果是临时的,那么就会被释放.
这就是智能指针.

不要问为什么,因为出错就知道为什么了...
相关错误的记录在这里:
https://www.cnblogs.com/JJBox/p/12371467.html

为此我还把整个博客上面的内容加了using.
当然了,如果你用的是IFox,那么事务栈的GetObject已经被设计过了.


此处记录了一个经典案例,尝试把using对象的权限偷出去
https://www.cnblogs.com/JJBox/p/12433735.html

不知道为什么VS没有进行强行提示,
但凡实现过IDisposable接口的对象给你来个波浪线就好啦.
不过这好像也不会惠及CAD,
因为CAD实现的不是这个接口...

CAD的类用的是DisposableWrapper接口,
不是IDisposable接口,造成没有自动引用析构.

我才知道原来还有车规级代码,
百分百测试覆盖...
但凡设计机器的,连动态加载都不允许,动态数组也不允许,
还得用静态链表,因为存在电子反转,还得纠错码...

细枝末节:
无序找值居然能提速:
https://blog.csdn.net/Xiaowu_First/article/details/88946222
分支预测居然提速6倍:
https://www.cnblogs.com/xindoo/p/13192669.html
回复

使用道具 举报

 楼主| 发表于 2024-12-17 02:02:29 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2024-12-26 17:33 编辑

此处记录了一个经典案例,
1,不要把using对象的权限偷出去.
2,既有创建新对象又有读取旧对象,
后续共同逻辑封装起来就可以用using了,
这样就从来不需要手动释放,
不需要先att.IsNewObject再att.Dispose()
https://www.cnblogs.com/JJBox/p/12433735.html
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-27 01:27 , Processed in 0.165112 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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