错误、漏洞、问题 - 页 2296

 
A100:

没有问题...有一个错误。我也不明白你为什么要把解释从你的脑子里拉出来。 默认的打印有以下签名。

而且它还可以与其他功能相冲突(如果需要的话)

打印签名超出了MQL5语言 的范围。如果MQL5完全禁止Print重载,这将不是一个错误。

我希望这个 "错误 "不会妨碍你创建TS,也不需要编写拐杖。

 

我测量了测试仪的性能。为了做到这一点,我在每个tick上开仓和平仓。我测量了100点的执行时间。我把它运行了100 000次。我总共测量了1000个刻度。我得到了这个图表

在它们之间的距离几乎相等的情况下,出现了减速的尖峰。我在优化模式下测量了它。如果我忽略这些尖峰,测试仪的性能就会变化25%,而不是恒定值。也许又是Windows速度测光的把戏。


ZZZ 同样的代码在MT4上运行

平均而言,MT4测试器处理一个刻度的时间比MT5少1.5-2倍。

附加的文件:
Tester.mq5  2 kb
 

可能通过使用遗传优化算法 来涌现。


...在每一个刻度上打开和关闭一个位置。<br / translate="no">
平均而言,MT4-Tester处理一个tick的时间比MT5少1.5-2倍。
而这纯粹是操纵和误导。
 
Sergey Dzyublik:

可能通过使用遗传优化算法 来涌现。

没有GA。从一个Agent上的两个通道进行优化。

而这已经是纯粹的操纵和误导了。

源代码已经到位。

 

一种情况是警告,另一种情况是错误

void f()
{
    for ( int i = 0;; )
    {
        Print( i );
        int    i = 5; //Warning: declaration of 'i' hides local declaration
        Print( i );
        break;
    }
}
void For( int i = 0 )
    {
        Print( i );
        int    i = 5; //Error: redefinition of formal parameter 'i'
        Print( i );
    }

根本区别是什么?以C++为例,在这两种情况下都会出现错误

 

我请求有识之士的帮助,以了解类实例的指针问题。我不明白这一点。

下面是一个脚本的例子。

class A
  {
public :
                     A() { Print("Start"); };
                    ~A() { 
                     Print("End"); 
                     Print(EnumToString(CheckPointer(GetPointer(this)))); 
                     if (CheckPointer(GetPointer(this))!=POINTER_DYNAMIC) 
                     delete GetPointer(this);};
  };
  
A a;

void OnStart()
  {
  }

当执行它时,我们有,如预期。

2018.09.23 21:56:20.574 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:56:20.574 Test_CheckPointer (EURUSD,M1)   End
2018.09.23 21:56:20.574 Test_CheckPointer (EURUSD,M1)   POINTER_AUTOMATIC


如果一个类的实例被声明为。

A *a= new A;

那么在执行时,我们有。

2018.09.23 21:46:42.960 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:46:42.961 Test_CheckPointer (EURUSD,M1)   1 undeleted objects left
2018.09.23 21:46:42.961 Test_CheckPointer (EURUSD,M1)   1 object of type A left
2018.09.23 21:46:42.961 Test_CheckPointer (EURUSD,M1)   32 bytes of leaked memory

也就是说,析构器甚至没有被启动,因此内存没有被释放。


但如果一个类的实例被声明为。

A a= new A;

构造函数启动了两次,析构函数启动了一次,但是内存没有被释放,我们有POINTER_AUTOMATIC 对象指针类型,尽管它本来是POINTER_DYNAMIC 的。

2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   End
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   POINTER_AUTOMATIC
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   1 undeleted objects left
2018.09.23 21:54:24.845 Test_CheckPointer (EURUSD,M1)   1 object of type A left
2018.09.23 21:54:24.845 Test_CheckPointer (EURUSD,M1)   32 bytes of leaked memory


如何总是执行析构器并正确执行删除

 

Как добиться всегда выполнения деструктора и правильного выполнения delete.


请看来自C++的智能指针的主题,并适应MQL(https://habr.com/post/140222/)
也许kodobase里有什么东西...

 
Sergey Dzyublik:


请看来自C++的智能指针主题和适应MQL(https://habr.com/post/140222/)
也许kodobase里有什么东西...

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

 
Nikolai Semko:

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

然后像这样试试。
class A { public:
         A() { Print( 1, ":", EnumToString(CheckPointer(GetPointer(this)))); }
        ~A() { Print( 2, ":", EnumToString(CheckPointer(GetPointer(this)))); }
};
class B { public:
         B( void *b ) : b( b ) {}
        ~B() { delete b; }
        void *b;
};
A a1;
A *a2 = new A;
B b( a2 );
void OnStart() {}

结果。

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

 
Nikolai Semko:

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

new 创建,用delete删除