错误、漏洞、问题 - 页 2297

 
Nikolai Semko:

谢谢,但我在那里没有看到对我的问题的任何答案。
我不明白为什么当A *a= new A 时不调用析构器

https://www.mql5.com/ru/docs/basis/variables/object_live

所有由表达式pointer_object=newClass_name创建的对象必须在事后被delete(pointer_object)操作符销毁如果由于某种原因,这个变量没有被删除操作者 销毁,有关它的信息将出现在 "专家 "日志中。可以声明几个变量,并把它们都分配给同一个对象指针。

Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
  • www.mql5.com
После загрузки на исполнение mql5-программы каждой переменной выделяется память в соответствие с типом переменной. Переменные делятся на два типа по уровню доступа - глобальные переменные и локальные переменные, и по классам памяти: входные параметры mql5-программы, статические и автоматические. Каждая переменная при необходимости...
 

我要求MQL检查OnTimer()函数

由于某些原因,它在MT4的策略测试器中不起作用(没有错误,只是这个函数里面没有任何东西被执行),而在网上则没有问题。

对于MT5来说,该功能在测试器和在线中都可以使用。

谢谢你!

 
大量的时间花在不正确的启动上
Core 1  pass 114 tested with error "incorrect input parameters" in 0:00:00.218

在OnInit中,只有两个数字被比较,而且一个不正确的通过比一个完整的通过需要更多的时间。怎么会呢?


让我们在完全优化的情况下运行这个专家顾问

input int Range = 0; // задать Оптимизацию 1 .. 10000

int OnInit() { return(INIT_PARAMETERS_INCORRECT); }


我们得到了8个代理的工作结果

Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 24 seconds


这里是我们的专家顾问,现在

input int Range = 0; // задать Оптимизацию 1 .. 10000

void OnInit() {}
Tester  optimization finished, total passes 10000
Statistics      optimization done in 0 minutes 31 seconds


最后,像这样的

input int Range = 0; // задать Оптимизацию 1 .. 10000

void OnInit() { ExpertRemove(); }
Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 19 seconds


两个输出

  1. 在速度方面,Incorrect-Init和ExpertRemove 是一样的。
  2. 空运行比从OnInit退出要快~5倍。


关于第二点,显然存在着某种错误。从时间上看,执行空运行比从OnInit中跳出来更有利。请纠正它,因为Incorrect-Init和ExpertRemove的优势将几乎完全丧失。

 

带有EA/指标/脚本和账户的收藏夹标签 只有在退出终端后才会被记住。正因为如此,非正常退出(断电)会重置这个标签。更改时是否可以保存?

有时,人们清楚地认识到,如果能将文件夹添加到收藏夹中,将会非常方便。

 
A100:
然后像这样试试。

结果。

1:pointer_automatic
1:pointer_dynamic
2:pointer_dynamic
2:pointer_automatic

谢谢你!相当于一个解决方案。

但是,编译器不说脏话可能更好。

class B  { public:
                     B(void *b) {d=b;}
                    ~B() { delete d; }
   void             *d; };

这是个错误还是什么?
当你通过new 创建一个类的实例时,它并不调用析构器。

创建一个特殊的类来调用析构器,这是唯一的解决办法吗?或者我们可以不这样做吗?

 
Andrey Barinov:

new 创建,用delete删除

问题是把delete 放在一个析构器中,但是当通过new (A *a=newA ;)创建一个类的实例时,析构器没有被调用。

 
aleger:

有没有可能,如果有,如何在任何ZigZag指标中得出价格极值High和Low的相应值。

确保它们稳定地结合并靠近成型的顶部和底部?

OBJ_TEXT 的例子

 

谢谢你。
这正是这里所说的。

Все объекты, созданные выражением указатель_объекта=new Имя_Класса, обязательно должны быть впоследствии уничтожены оператором delete(указатель_объекта). 
Если по каким то причинам такая переменная по окончании работы программы не была уничтожена оператором delete, то об этом будет выведено сообщение в журнал "Эксперты". 
Можно объявить несколько переменных и всем им присвоить указатель одного объекта.
Если динамически создаваемый объект имеет конструктор, то этот конструктор будет вызван в момент выполнения оператора new. Если объект имеет деструктор, 
то деструктор будет вызван в момент выполнения оператора delete.

所以这不是一个错误,而是一个导致恶性循环的特征。
如果我想把删除一个动态对象的过程自动化,析构器只在delete 时被调用,所以把delete 放到析构器本身是没有用的。
但自动化可以通过另一个类的另一个实例来实现,正如@A100在这里 建议的那样。

 
aleger:

谢谢你的提示。我读了又读,试了又试,已经很累了。我想看看ZigZag的工作实例...

就像我的头像上的 "之 "字形,但上极点的结合是正确的,因为下极点的结合是可以的!"。

用k=(WindowPriceMax()-WindowPriceMin())/30的绑定方式在窗口尺寸变化较大时不起作用,我希望有别的办法。


OBJ_TEXT 的例子中,顶部和底部都有绑定。遵循该链接,运行该例子...

 
Nikolai Semko:

所以这不是一个错误,而是一个特点,导致了一个恶性循环。

前面已经告诉你,解决分配的不可管理的资源的控制的方法是使用智能指针。与C++的全面类比。
也许问题在于,解决方案并不是在银盘子上呈现的,对不起。


每个人都可以在网站搜索中输入 "shared_ptr",并按照第一个结果进行搜索,这并不难,我强烈建议大家尝试。