MQL5中的OOP问题 - 页 8

 
Igor Makanu:

不要写删除 - 一切都会正常工作,这种罪过(我是说迷信))。)将接管终端,并在其日志中嘀咕 "48字节的泄漏内存",然后 "剩下2个CX类型的对象 "和 "剩下未删除的对象"

HH:在指标 模板中,没有Deinit()--这很烦人。

为什么不创建一个对象,而不是一个指针?那么它也不会喃喃自语--终端子系统会跟踪它,并在需要时钉住它。

 
Dmitry Fedoseev:

不删除也能工作,但没有用。但是,终端是否照顾到了这个问题?它只报告内存泄漏,但并不奉献给相同的对象。

终端将负责删除new创建的对象,如果这些对象的指针被堆积在终端已知的对象中,例如ArrayObj、List等...。

 
Artyom Trishkin:

为什么不创建一个对象而不是一个指针?那么它也不会喃喃自语--终端子系统会跟踪它,并在需要时钉住它。

因为https://www.mql5.com/ru/forum/85652/page7#comment_12329866

阿尔乔姆-特里什金

终端将负责删除new创建的对象,如果这些对象的指针被堆积在终端已知的对象中,例如ArrayObj、List等。

并不总是方便的无监督销毁,但我要检查一下,也许我错了 - 我很少使用CObject

 

这是一个非常特殊的、怪异的简化案例。创建一个不能被改变的对象,因此要改变它的字段,你必须把它钉死,然后创建一个新的对象。

如果我们需要改变几个对象字段,并留下其他字段的必要信息呢?IMHO--最好是照顾到每个对象的交互性和可管理性(感谢继承),而不是拿着枪坐在那里,一打喷嚏就打兔子。

虽然,公平地说--有时杀死并创建一个新的,比在大量的对象中寻找想要的对象并改变它更快。除非,当然,有一个直接的链接......

 
Artyom Trishkin:

好吧,在我看来,这是一个非常特殊和怪异的简单化的案例。要创建一个绝对不能改变的对象,因此要改变其字段的值,你必须把它钉死,然后生出一个新的对象。

如果我们需要改变几个对象字段,并留下其他字段的必要信息呢?IMHO--最好是照顾到每个对象的交互性和可管理性(感谢继承),而不是拿着枪坐在那里,一打喷嚏就打兔子。

虽然,公平地说--有时杀死并创建一个新的,比在一大堆中寻找所需的并改变它更快。当然,除非你有一个直接的链接...

hmmm, you're way off base....是的,但不是这样的 ))))

因为它很方便,所以你应该这样使用它!- 而这些来自 "第一本C++教科书 "的例子,可以在你的一生中都被拉进你的经验中....。举个例子,我把@fxsaber的 代码拆开了相当一部分,让自己尽可能多地使用#define--代码不仅变短了,而且真的更有可读性,消除了错别字--C++书里有这么教的吗? ;)


阿尔乔姆-特里什金

虽然,公平地说--有时杀死并创建一个新的,比在一大堆中寻找一个需要的并改变它更快。当然,如果没有直接针对它的问题...

和关于书的基础知识...根据编程中的 "良好的繁殖规则",以下是预期的:你必须声明一个变量并立即初始化它(这可以让你在调试时避免错误),在OOP中,构造函数为这些目的服务--你创建了一个对象并初始化它的所有

如果你需要 "在一个简单的对象之后拉动整个代码",你将需要一个方法来重新初始化所有的类字段--为什么要重复这个?- Kill/create = result....但是,这又是一个品味和宗教的问题。

 
Igor Makanu:

因为https://www.mql5.com/ru/forum/85652/page7#comment_12329866

对于无监督的破坏,我并不总是感到舒服,但我要检查一下,也许我错了 - 我很少使用CObject

但你确实使用了清单。那里也是如此。除非内存管理的标志FreeMode()没有为列表重置--在这种情况下,终端不会跟踪--所有的事情都由用户承担。但这种情况是需要的,以便能够改变、删除、排序和对列表的副本做其他事情--事实上,列表是用指向对象的指针创建的,如果你创建一个新的列表,是其中一个列表的副本,并开始改变新列表中的对象(有指向对象的指针),那么原始列表中的对象将被改变(因为我们用指针工作)。那就是保留原件并摆弄他的副本,然后你需要为副本放弃内存管理的标志:FreeMode(false) - 然后副本成为一个独立的副本,你可以安全地处理其中的对象,而不影响原件。请记住,当你从终端子系统中解除对列表拷贝的绑定时,那么现在要对删除列表对象负责。你可以跟踪它并在OnDeinit()中删除它,这是在最简单的情况下,如果复制列表是我们之前知道的,或者创建一个对象列表,它总是放置新创建的列表,之前不知道有手动内存管理的标志。然后终端将跟踪这个列表对象并正确地删除堆积在其中的列表。

 
Artyom Trishkin:

如果new创建的对象的指针被堆积在终端已知的对象中,例如ArrayObj、List等,终端将接管删除这些对象的工作。

那么也就不会有泄漏信息。

 
Dmitry Fedoseev:

那么也就不会有泄密的报道了。

是的,它不会。因为不会有泄漏。

如果我们在某个地方创建了一个新的对象,并且收到了一个指针,我们必须通过这个指针删除这个对象。这意味着我们需要跟踪指针。为此,SB中提供的指向对象的列表或数组非常好。但你也可以负责对新创建的对象进行跟踪和控制。但是,对我来说,如果已经提供了,为什么还要写大量的代码?

 
Artyom Trishkin:

那么他们应该通过这个指针删除这个对象。

但是,对我来说,如果已经提供了,为什么还要写大量的代码呢?

我们谈论的是什么吨位? 你错过的一切都由终端报告,删除它的地方也知道 - OnDeint() ....所以这次讨论已经归结为对真空中的球形马的讨论?)))

 
Igor Makanu:

hmm, you've got to be kidding me.....像这样,但不像这样 ))))

因为它很方便,所以你应该这样使用它!- 而这些来自 "第一本S++教科书 "的例子可以在你的一生中拉到你的经验中....。举个例子,我把@fxsaber的 代码拆开了相当一部分,让自己尽可能多地使用#define--代码不仅变短了,而且真的更有可读性,没有错别字--他们在C++书里有这么教吗?)


关于书的基础知识...好的繁殖规则是:宣布一个变量并立即初始化它(这可以让你在调试时避免错误),在OOP中,构造函数就是为了这个目的--你创建了一个对象并初始化了一切

如果你需要 "在一个简单的对象之后拉动整个代码",你将需要一个方法来重新初始 所有的字段--为什么要重复这个?- Kill/create = result....但是,这又是一个品味和宗教的问题。

我说的不是一个对象的完全重新初始化,而是部分重新初始化--当几个字段需要改变,而其余的几十个字段仍然存储着你需要的信息...我们可能想也可能不想改变字段,但我们需要改变它们的方法。除非--再次--我们谈论的是一个只有一个字段的简单对象。 如果有两个或更多--你可能已经需要改变一个,其他的不做改变。

但也许我们谈论的是不同的事情?