错误、漏洞、问题 - 页 2488

 

当然我可能是错的,但似乎2个月前我的模板还在工作,而现在当我调用CList析构器时,没有被销毁的对象 仍然留在内存中,代码。

#property strict
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CData : public CObject
  {
public:
   int               x;
   double            y;
                     CData(){};
                     CData(int ival,double dval){x=ival;y=dval;}
  };
//+------------------------------------------------------------------+
template<typename T>class CDataBase
  {
private:
   CList            *mlist;
   T                *Tptr;
public:
   void CDataBase()           { mlist=new CList;                                    }
   void ~CDataBase(void)      { delete mlist;                                       }
   int ArraySize(void)        { return(mlist.Total());                              }
   T *operator[](int index)   { return(mlist.GetNodeAtIndex(index));                }
   void  AddValue (T &value)  { Tptr = new T; Tptr  = value; mlist.Add(Tptr);       }
   string TypeName()          { return(typename(T));                                }
  };
//+------------------------------------------------------------------+
void OnStart()
  {
   CDataBase<CData>*data=new CDataBase<CData>;
   int i;
   for(i=0; i<5; i++)
     {
      data.AddValue(new CData(i,i*2.0));
     }

   for(i=0; i<data.ArraySize(); i++)
     {
      Print(i," : ",data[i].x," , ",data[i].y);
     }
   Print(data.TypeName());
   delete data;
  }
//+------------------------------------------------------------------+

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 0 : 0 , 0.0

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 1 : 1 , 2.0

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 2 : 2 , 4.0

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 3 : 3 , 6.0

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 4 : 4 , 8.0

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) CData

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 剩余5个未删除对象

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 剩下5个CData类型的对象

2019.06.21 07:19:45.926 tstlist (EURUSD,H1) 280字节的泄漏的内存

MT5 build 2085
 
Igor Makanu:

当然我可能是错的,但似乎2个月前我的模板还在工作,但现在当我调用CList析构器时,没有被销毁的对象 仍然留在内存中,代码。

#property strict
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CData : public CObject
  {
public:
   int               x;
   double            y;
                     CData(){};
                     CData(int ival,double dval){x=ival;y=dval;}
  };
//+------------------------------------------------------------------+
template<typename T>class CDataBase
  {
private:
   CList            *mlist;
   T                Tptr;
public:
   void CDataBase()           { mlist=new CList;                                    }
   void ~CDataBase(void)      { delete mlist;                                       }
   int ArraySize(void)        { return(mlist.Total());                              }
   T operator[](int index)   { return(mlist.GetNodeAtIndex(index));                }
   void  AddValue (T &value)  { Tptr  = value; mlist.Add(Tptr);      }
   string TypeName()          { return(typename(T));                                }
  };
//+------------------------------------------------------------------+
void OnStart()
  {
   CDataBase<CData*>* data=new CDataBase<CData*>;
   int i;
   for(i=0; i<5; i++)
     {
      CData* Tmp = new CData(i,i*2.0);
      data.AddValue(Tmp);
     }

   for(i=0; i<data.ArraySize(); i++)
     {
      Print(i," : ",data[i].x," , ",data[i].y);
     }
   Print(data.TypeName());
   delete data;
  }
//+------------------------------------------------------------------+
 
fxsaber:

是的,你可能是对的,你的例子工作得很正确,在某处我把我的来源中的测试例子弄混了

谢谢你!

 
Вероника Сорокина:
下午好。情况是这样的。我写的mql4专家顾问/脚本/指标/什么的都不附在图表窗口上,我希望它能一直附在一个程序上......比如,我将写一个有用的东西,我不希望它一直附在新打开的图表上。类似服务的东西(来自MT5),但你在MT4上需要它。

使用服务

 

是否有可能将ME的当前代码添加到终端的收藏夹中?



实际上,我希望有一个单独的 "调试 "选项卡,在那里我可以添加目前正在编写和测试的代码。

现在发现,为了方便工作,有必要建立一个单独的终端,在那里不涉及当前项目 的一切。

那么调试就更快了,因为在终端本身没有与其他代码混淆。

 

亲爱的开发者。请澄清,指标缓冲区的自动重新划分是否正常?我所说的重新分区是指:窗口的最大条数,例如5000。缓冲区大小+速率_总数在达到6439时被重置为5000。当窗口中最大条数=10000时,也会发生同样的情况。复位发生在11439。

由于这个原因,指标可能会崩溃并显示不正确的数据。

建立2085年。我从2000年左右开始注意到这种行为。

 
Alexey Kozitsyn:

亲爱的开发者。请澄清,指标缓冲区的自动重新划分是否正常?我所说的重新分区是指:窗口的最大条数,例如5000。缓冲区大小+ rates_total在达到6439时被重置为5000。 当窗口中最大条数=10000时,也会发生同样的情况。复位发生在11439。

由于这个原因,指标可能会崩溃并显示不正确的数据。

建立2085年。我从2000年左右开始注意到这种行为。

这种行为最初是在五。

举例说明由于缓冲区重新分配导致的指标崩溃

 
Slava:

这就是 "五 "的行为,从一开始就如此。

举例说明由于缓冲区的重新分配而导致的指标崩溃

所以你是在确认,当有累计超过1439条的时候,终端必须将缓冲区大小重置为窗口中最大条数的值?如果是的话,应该在文件中提到这一点。因为这是不可预见的行为。

关于这个例子。我指的是与条形数字一起工作的定制开发。也就是说,我记住了6438号条形图,2分钟后(M1 TF)缓冲区被重新分配,我走出了阵列。现在很明显,这是 "标准 "行为。请更新文件。

 

执行过程中出错。

class A { public:
        virtual void f( int = 0 ) { Print( 1 ); }
};
class B : public A { public:
        virtual void f( int     ) { Print( 2 ); }
};
void OnStart()
{
        B b;
        b.f();
}

结果 : 1

预期:2或(如C++) - 编译错误

 
Alexey Kozitsyn:

请更新文件。

哪里需要更新文件?

一个酒吧的明确标识一直是酒吧的时间,而不是酒吧的编号。

如果有人对你的图表调用ChartSetSymbolPeriod,你会很容易捕捉到条数的变化。惊喜吗?

顺便说一下,在OnCalculate中有一个参数rate_total。