来自一个 "傻瓜 "的问题 - 页 106

 
uncleVic:
任务...请附上一个信号模块(我没有)。让我们看一看。
附加的文件:
 
openlive:

这就更奇怪了。这个效果对我来说没有发挥出来。
 
uncleVic:

更加怪异的是。我不明白这种效果。

只有在初始化时才有效果,在测试器中一切正常。

好吧,我不需要它,我真的不需要它。

 

Zigzag指标读取的是不再存在的数值(在重绘之前它们肯定是存在的)。 这一点可以避免吗?

如果数值在缓冲区里,为什么又不画了......。

 

下午好,请解释一下以下情况。

class Cbase
{
public:
        virtual ~Cbase(){};
        int k;
};

class Cchild:public Cbase
{
public:
        ~Cchild(){};
        double *p;
        int f;
};

我有两个类,我相信下一代的实例(base- child - child2 - ...),在内存中占用越来越多的空间。对于操作者New来说,我们确切地说出要分配多少内存,在参数中传递给类。但是在删除操作符 中,我们并没有说到底要分配多少内存。从这个推理出发,下一个情况会发生什么并不十分清楚。

void fn()
{
   Cbase *pClass;
   pClass = new Cchild;
   delete pClass;
   return;
}

我的意思是,我们将*pClass声明为指向Cbase(与Cchild相比是一个小类)的指针,但它实际上指向Cchild。因此,问题是,delete() 将如何表现?它将释放与Cbase大小相等 的字节数(那么内存将被堵塞),还是将正确地发生删除?

P.S: 好吧,关于这个问题还有一个问题:在分配的内存区域(新)中是否有任何标签,我们可以通过它来了解这个区域的大小(类似于char的存储,结尾是零终止符)?或者换句话说,一段对我所声明的类的大小一无所知的代码能够正确地释放内存吗?

 

220Volt:

问题是,delete() 将如何表现?它释放的字节数是否等于Cbase的大小 (那么内存将被堵塞),还是会正确地进行删除?

当然,它将正确释放内存。

P.S: 好吧,关于这个问题还有一个问题:在分配的内存区域(新)中是否有任何标签,我们可以通过它来了解这个区域的大小(类似于char存储,末端为零的终止符)?或者换句话说,一个对我所声明的类的大小一无所知的代码片段能否正确地释放内存?

sizeof ?
 
sergeev:

当然会正确删除。你可以把砖点分散到破坏者身上。

这大概就是这个问题的来源。我已经大致按照描述做了(析构器不是虚拟的),指针类下面的析构器没有被调用。
 
sergeev:
sizeof ?
我认为sizeof在编译时是有效的,但我说的是例如从另一个进程释放内存。如果这是可能的,那么我认为删除功能是可以理解的。
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
  • www.mql5.com
Основы языка / Операторы / Оператор уничтожения объекта delete - Документация по MQL5
 
MQL5中的析构器总是虚拟的。一切都被正确地删除了,试着把Print(__FUNCSIG__);放在解构器中。

class CFoo
  {
public:
   ~CFoo() { Print(__FUNCSIG__); }
  };

class CBar : public CFoo
  {
public:
   ~CBar() { Print(__FUNCSIG__); }
  };

void OnStart()
  {
   CFoo *f=new CBar();
   
   delete f;   
  }
 
问题甚至不在于我们通过new在类函数中设置了什么,而在于其 "本地 "成员的类数据。毕竟,它们也不是空的空间。