MQL5中的OOP问题 - 页 4

 
Dmitry Fedoseev:
指针也可以通过非引用方式传递--没有&。
是的,你可以。但是如果我们传递一个没有&的指针,就会在堆栈上创建一个新的指针,传递的值被分配到这个指针上。此外,如果我们在一个函数中用这个指针分配内存,那么改变的是堆栈上创建的指针,这意味着我们在解开堆栈时得到内存泄漏。当然,这样做是不好的,但如果想...
 
Vladimir Simakov:
如果以这种方式调用析构器,在堆栈上创建的指针将被改变,因此,当堆栈被 "解开 "时,我们会得到内存泄漏。当然,这样做是不好的,但如果想...

MQL中类的指针的行为是不可预测的,一个管理员曾经写道,所有的类都是在全局内存中创建的(内存分配),你写道,本地范围内的类的指针是在堆栈中创建的(我认为,应该是这样!)。

虽然我可能混淆了一些东西,也许我会检查一下 - 理论上不难检查,你只需要在测试类的析构器中注册Print(),析构器必须在离开本地范围时自动调用......

 
Vladimir Simakov:
是的,他们可以。只有当我们传递一个不带&的指针时,才会在堆栈上创建一个新的指针,并将传递的值分配给这个指针。如果我们在一个函数中通过这个指针分配内存,那么在堆栈上创建的指针就会发生变化,所以在解开堆栈时我们会得到内存泄漏。当然,这样做是不好的,但如果想...

不会有泄漏。因为没有人在函数中为这个指针分配任何东西。

 
Igor Makanu:

MQL中类的指针的行为是不可预测的,一个管理员曾经写道,所有的类都是在全局内存中创建的(内存分配),你写道,本地范围内的类的指针是在堆栈中创建的(我认为,应该是这样!)。

虽然我可能被什么东西搞糊涂了,也许我会检查一下--理论上不难检查,只要在测试类的析构器中注册Print()就可以了,析构器必须在离开本地范围时自动调用......

如果内存是动态分配的(new),它被分配在堆中,如果你在堆中创建一个对象(CObj obj;),那么内存也会在堆中分配给它。

 
Dmitry Fedoseev:

不会有泄漏。因为没有人在函数中为这个指针分配任何东西。

void CreateLabel(CChartObjectLabel *l,string name,int y)
  {
   l=new CChartObjectLabel;
   l.Create(0,name,ChartWindowFind(),0,y);
   l.Color(clrYellow);
   l.FontSize(14);
   l.Description(name);
  }

这是一个典型的泄漏。在堆栈上创建的指针,以及在创建时用传入函数的值初始化的指针被分配了一个新的值,成为一个新对象的指针。此后,当堆栈展开时,指针被安全地杀死。这正是我们需要证明的。这正是它应该存在的地方。

void CreateLabel(CChartObjectLabel* &l,string name,int y)
 
Vladimir Simakov:

如果内存是动态分配的(new),它被分配在堆中,如果你在堆中创建一个对象(CObj obj;),内存也会在堆中分配给它。

在mql中没有这种东西--(CObj obj;)。

 
Vladimir Simakov:

一个典型的泄漏。一个在堆栈上创建并在创建时用传入函数的值初始化的指针被分配了一个新的值,成为一个新对象的指针。之后,当堆栈被展开时,指针被安全地杀死。这正是我们需要证明的。这正是它应该在的地方。

不要把上帝的礼物和鸡蛋混为一谈。更有理由编写白痴代码来证明一个错误的声明......。

 
Dmitry Fedoseev:

在mql中没有这样的东西--(CObj obj;)。

来吧!我一直在使用它。
 
Vladimir Simakov:
void CreateLabel(CChartObjectLabel *l,string name,int y)
  {
   l=new CChartObjectLabel;
   l.Create(0,name,ChartWindowFind(),0,y);
   l.Color(clrYellow);
   l.FontSize(14);
   l.Description(name);
  }

一个典型的泄漏。一个在堆栈上创建并在创建时用传入函数的值初始化的指针被分配了一个新的值,成为一个新对象的指针。之后,当堆栈被展开时,指针被安全地杀死。这正是我们需要证明的。这正是它应该在的地方。

为什么你会故意重新分配一个 传递给函数 的指针?当然,会有泄密事件发生。但这不是一个 "典型的泄漏",而是一个典型的使用对象的指针的错误。

你不必在这里创建一个新的对象,而是处理外部对象,该对象的指针被传入函数。

 
Vladimir Simakov:
来吧!我一直在使用它。

在哪里? 在哪里,如何?