1

我正在创建一个识别烛台形状的指标。

为此,我创建了一个单独class Candlestick的包含在指标文件中的文件。

问题是我遭受内存泄漏。

我是指针的新手,在阅读/观看了很多之后,我似乎仍然错过了一些东西。

这是指标类。课程的内容Candlestick无关紧要,因此我将其省略。

Candlestick *candles[]; 

void OnDeinit(const int reason)
{
    for(int i = 0; i < ArraySize(candles); i++ ){
      delete(candles[i]);
    }
}

int OnCalculate(args here)
{
    ArrayResize(candles, Bars);

    for(int i = MathMax(Bars-2-IndicatorCounted(), 1); i >= 0; i--)
    {            
        candles[i] = new Candlestick();

        // Do stuff with this candle (and other candles) here e.g.
        if(candles[i+1].type == BULLISH) Print("Last candle was Bullish");
    }
}

当我这样做时,我得到内存泄漏错误。看来我需要删除指向该动态数组中蜡烛的指针。问题是,何时地?因为我在for(){...}循环的下一次迭代中需要它们。所以我不能在那里删除它。

当我在OnDeinit()函数中删除它时,仍然有蜡烛,我仍然得到泄漏错误。

怎么来的?

4

1 回答 1

2

首先,尼克,欢迎来到世界MQL4

您可能已经意识到,MQL4代码不是C.

在许多重要的区别中,这里的关键是代码执行平台(MetaTrader Terminal 4)在什么时候做什么。

OnCalculate()是一个类似僵尸的进程,它被多次调用,但无论如何,绝对不在你的控制之下

其次,OnCalculate()按设计并不意味着新的Bar.


如何?

MQL4概念上起源于那些日子,当计算资源在代码执行阶段的时间共享 CPU-MUX-ing 方面更小并且更昂贵时。

因此,MQL4-user-domain 语言保留了一些无法直接访问的隐藏宝石的好处。其中之一是非常有效的基于寄存器的更新处理并保持动态资源分配最小,因为它们对实时执行可预测性产生毁灭性的不利影响。

这将帮助您了解如何以更智能的方式设计和处理您的概念对象,最好通过模仿这种“石器时代”但非常高效的行为(时间和内存方面),而不是淹没您的内存池每次调用都有无限数量的非托管OnCalulate()实例new Candlestick(); // *--> candles[]


最好的下一步:

如果有疑问,只需阅读ArrayResize()平台 localhost-help/documentation 中的最佳实践,开始了解nano$econd$在专业软件设计中引入开销(如果不是块的话)的事情。

于 2016-04-12T14:23:29.270 回答