来自一个 "傻瓜 "的问题 - 页 107 1...100101102103104105106107108109110111112113114...277 新评论 [删除] 2012.02.24 09:40 #1061 mql5: MQL5中的析构器总是虚拟的。一切都被正确地删除了,试着把Print(__FUNCSIG__);放在解构器中。 我是用VC++做的,但我想内存释放 机制是一样的,对吗? Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete www.mql5.com Основы языка / Операторы / Оператор уничтожения объекта delete - Документация по MQL5 Ilyas 2012.02.24 09:41 #1062 220Volt: 我是用VC++做的,但我想内存释放 机制是一样的? 不,在C++中,你必须指定虚拟析构器来正确地通过删除来删除对象。 但你的例子将正确工作,因为你可以只为基类指定虚拟析构器。 [删除] 2012.02.24 09:54 #1063 我试着用一种稍微不同的方式来表达这个想法。鉴于。1号类--它在内存中占据100个字节。2号类--它是1号类的后代,在内存中占据200字节。指向1号班的指针。行动。在指针中写入类#2的实例所在的内存区的地址(调用new)。通过将删除功能传递给存储在指针中的地址来释放焊接区域。P.S.: 图中显示的是内存模型 ) [删除] 2012.02.24 09:57 #1064 我有疑问,因为第一类的指针,但实际上第二类是在内存中。在破坏者的情况下,这确实很重要,所以我想知道这里是否也会有问题。我认为在这种情况下,只有当内存中存在一些标签(如带有空结尾的char)或类似的东西时,才能发生正确的内存释放,这就是为什么我问内存分配问题。 Mykola Demko 2012.02.24 10:08 #1065 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的构造本身以及删除都是交错进行的,所有这些信息都被储存起来(虚拟指针本身记得该类是作为基类和子类的复合构造的),当删除时,析构器的调用顺序是相反的,从后一个到前一个。 [删除] 2012.02.24 10:24 #1066 这不是关于析构器,而是关于类本身,更准确地说,是关于它占用多少字节。事实证明,我们分配了200个字节,然后告诉我释放内存,它是由一个代表100字节大小的对象的指针指向的。 Ilyas 2012.02.24 10:37 #1067 220Volt: 这不是关于析构器,而是关于类本身,更准确地说,是关于它占用多少字节。事实证明,我们分配了200字节,然后告诉我释放代表100字节大小的对象的指针所指向的内存。 我认为你的问题是与内存池的工作方式有关。 是的,内存池知道一块内存会在多长时间内被删除调用释放。 这些信息的存储位置取决于池的实现。 例如,如果你在C++中给一个没有通过new分配的对象一个指针,你会看到你的应用程序会崩溃。 Mykola Demko 2012.02.24 10:37 #1068 220Volt: 这不是关于析构器,而是关于类本身,更准确地说,是关于它所占用的字节数。事实证明,我们分配了200字节,然后告诉我释放代表100字节大小的对象的指针所指向的内存。 我想你还没有查过我的样本。否则你就不会问这样的问题。 [删除] 2012.02.24 10:47 #1069 我在想,我记得你可以为一个int的数组分配内存,例如,然后删除所有的int,尽管一个int很小,可能对类也是如此。谢谢你的回答。 [删除] 2012.02.24 10:49 #1070 mql5: 我理解你的问题是与内存池的工作方式有关。 是的,内存池知道一个片断会在多长时间内被删除调用释放。 这些信息的存储位置取决于池的实现。 例如,如果你在C++中给一个没有通过new分配的对象一个指针,你会看到你的应用程序会崩溃。 就这些了,谢谢你。 1...100101102103104105106107108109110111112113114...277 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
MQL5中的析构器总是虚拟的。一切都被正确地删除了,试着把Print(__FUNCSIG__);放在解构器中。
我是用VC++做的,但我想内存释放 机制是一样的?
但你的例子将正确工作,因为你可以只为基类指定虚拟析构器。
我试着用一种稍微不同的方式来表达这个想法。
鉴于。
行动。
P.S.: 图中显示的是内存模型 )![](https://c.mql5.com/3/7/xnajoemxmx.png)
怀疑是因为指向一号类的指针和实际在内存中的二号类。在破坏者的情况下,这确实很重要,所以我想知道这里是否也会有问题。我认为在这种情况下,只有当内存中存在一些标签(如带有零终结符的char)或类似的东西时,才能发生正确的内存释放,这就是为什么我问内存分配问题。
你的疑问是因为你没有指定构造函数(理解这种情况下的情况很重要),试着运行这个例子,你会明白一切。
HZ的构造本身以及删除都是交错进行的,所有这些信息都被储存起来(虚拟指针本身记得该类是作为基类和子类的复合构造的),当删除时,析构器的调用顺序是相反的,从后一个到前一个。
这不是关于析构器,而是关于类本身,更准确地说,是关于它占用多少字节。事实证明,我们分配了200字节,然后告诉我释放代表100字节大小的对象的指针所指向的内存。
是的,内存池知道一块内存会在多长时间内被删除调用释放。
这些信息的存储位置取决于池的实现。
例如,如果你在C++中给一个没有通过new分配的对象一个指针,你会看到你的应用程序会崩溃。
这不是关于析构器,而是关于类本身,更准确地说,是关于它所占用的字节数。事实证明,我们分配了200字节,然后告诉我释放代表100字节大小的对象的指针所指向的内存。
我理解你的问题是与内存池的工作方式有关。
是的,内存池知道一个片断会在多长时间内被删除调用释放。
这些信息的存储位置取决于池的实现。
例如,如果你在C++中给一个没有通过new分配的对象一个指针,你会看到你的应用程序会崩溃。