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

 
mql5:
MQL5中的析构器总是虚拟的。一切都被正确地删除了,试着把Print(__FUNCSIG__);放在解构器中。


我是用VC++做的,但我想内存释放 机制是一样的,对吗?
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
  • www.mql5.com
Основы языка / Операторы / Оператор уничтожения объекта delete - Документация по MQL5
 
220Volt:
我是用VC++做的,但我想内存释放 机制是一样的?
不,在C++中,你必须指定虚拟析构器来正确地通过删除来删除对象。

但你的例子将正确工作,因为你可以只为基类指定虚拟析构器。
 

我试着用一种稍微不同的方式来表达这个想法。

鉴于。

  • 1号类--它在内存中占据100个字节。
  • 2号类--它是1号类的后代,在内存中占据200字节。
  • 指向1号班的指针。

行动。

  • 在指针中写入类#2的实例所在的内存区的地址(调用new)。
  • 通过将删除功能传递给存储在指针中的地址来释放焊接区域。

P.S.: 图中显示的是内存模型 )

 
我有疑问,因为第一类的指针,但实际上第二类是在内存中。在破坏者的情况下,这确实很重要,所以我想知道这里是否也会有问题。我认为在这种情况下,只有当内存中存在一些标签(如带有空结尾的char)或类似的东西时,才能发生正确的内存释放,这就是为什么我问内存分配问题。
 
220Volt:
怀疑是因为指向一号类的指针和实际在内存中的二号类。在破坏者的情况下,这确实很重要,所以我想知道这里是否也会有问题。我认为在这种情况下,只有当内存中存在一些标签(如带有零终结符的char)或类似的东西时,才能发生正确的内存释放,这就是为什么我问内存分配问题。

你的疑问是因为你没有指定构造函数(理解这种情况下的情况很重要),试着运行这个例子,你会明白一切。

class CFoo
  {
public:
                     CFoo() { Print(__FUNCSIG__); }
                    ~CFoo() { Print(__FUNCSIG__); }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CBar : public CFoo
  {
public:
                     CBar() { Print(__FUNCSIG__); }
                    ~CBar() { Print(__FUNCSIG__); }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   CFoo *f=new CBar();

   delete f;
  }
//+------------------------------------------------------------------+

HZ的构造本身以及删除都是交错进行的,所有这些信息都被储存起来(虚拟指针本身记得该类是作为基类和子类的复合构造的),当删除时,析构器的调用顺序是相反的,从后一个到前一个。

 
这不是关于析构器,而是关于类本身,更准确地说,是关于它占用多少字节。事实证明,我们分配了200个字节,然后告诉我释放内存,它是由一个代表100字节大小的对象的指针指向的。
 
220Volt:
这不是关于析构器,而是关于类本身,更准确地说,是关于它占用多少字节。事实证明,我们分配了200字节,然后告诉我释放代表100字节大小的对象的指针所指向的内存。
我认为你的问题是与内存池的工作方式有关。
是的,内存池知道一块内存会在多长时间内被删除调用释放。
这些信息的存储位置取决于池的实现。

例如,如果你在C++中给一个没有通过new分配的对象一个指针,你会看到你的应用程序会崩溃。
 
220Volt:
这不是关于析构器,而是关于类本身,更准确地说,是关于它所占用的字节数。事实证明,我们分配了200字节,然后告诉我释放代表100字节大小的对象的指针所指向的内存。
我想你还没有查过我的样本。否则你就不会问这样的问题。
 
我在想,我记得你可以为一个int的数组分配内存,例如,然后删除所有的int,尽管一个int很小,可能对类也是如此。谢谢你的回答。
 
mql5:
我理解你的问题是与内存池的工作方式有关。
是的,内存池知道一个片断会在多长时间内被删除调用释放。
这些信息的存储位置取决于池的实现。

例如,如果你在C++中给一个没有通过new分配的对象一个指针,你会看到你的应用程序会崩溃。
就这些了,谢谢你。