你有种再说一遍 发表于 2024-12-11 04:05:00

cad.net 内存泄露

本帖最后由 你有种再说一遍 于 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
页: [1]
查看完整版本: cad.net 内存泄露