新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 598

 
Juer:

你能告诉我,我是否在创建一个CArrayObj对象并向其添加其他对象?我仍然需要这些物体本身。而且我可以删除这个列表对象。

在删除之前,我应该用哪种方法来删除其中的对象?Detach() 还是Delete()

或 Clear() / Shutdown() ?

混乱是因为你不了解内存是如何分配的,以及应该如何处理。在一般情况下,无论是CArrayObj还是位于其中的对象。 没有必要手动删除.

// Где-то в коде есть объект CArrayObj
CArrayObj ArrayOfItems;
...
//Где-то в коде заполнили коллекцию пользовательскими объектами
void Create()
{
  ArrayOfItems.Add(new CUserItem());
  ArrayOfItems.Add(new CUserItem());
  //...
  ArrayOfItems.Add(new CUserItem());
}
// Так не правильно делать. Удалять ничего не надо.
void OnDeinit(const int reason)
{
   delete ArrayOfItems;
}
 

我把一个对象传给类函数,是对它的引用,这样函数中的动作就会发生在它身上,然后它就会被返回。但我不需要类对象 本身了......那么,我怎样才能删除它呢?

for(int i=0;i<test_objects.Total();i++)
  {
   bool res=false;
   CTestObject *test_object=test_objects.At(i);
   if(!CheckPointer(test_object)
        continue;
   CTestClass *test_class=new CTestClass();
   if(test_class.Check(test_object))
        res=true;
   delete test_class;
  }

像这样。当我删除test_class时,它说在下一次迭代时指针无效...。

我如何删除test_class而不删除传递给它的对象?

 
Vasiliy Sokolov:

你感到困惑是因为你不了解内存是如何分配的,以及应该如何处理。在一般情况下,无论是CArrayObj还是它里面的对象。 没有必要手动删除.

好吧,如果我已经创建了一个对象的数组。也就是说,我创建了一个数组对象ArrayObj,对它进行了必要的操作。那么我不需要这个对象,但需要里面的对象本身(数组成员),我是不是应该删除这个数组对象?

 

这个vv Ihor Herasko将使它在周末,它不在那里;)

问题从上周四开始就一直悬而未决!: )

我毕竟要对我的评论负责,而且我给了你一个好的评论,友好点,结束你的游戏,就像 "我每天回答一个问题 "一样,因为我对等待不感兴趣,而且我真的不想校对我的评论。)
 
Juer:

我把一个对象传给类函数,是对它的引用,这样函数中的动作就会发生在它身上,然后它就会被返回。但我不需要类对象 本身了......那么,我怎样才能删除它呢?

像这样。当我删除test_class时,它说在下一次迭代时指针无效...。

如何删除test_class而不删除传递给它的对象?

你需要避免创建指向对象的指针。取而代之的是直接在函数的堆栈上与对象一起工作。

CTestClass test_class;
for(int i=0;i<test_objects.Total();i++)
  {
   bool res=false;
   CTestObject *test_object=dynamic_cast<CTestObject*>(test_objects.At(i));
   if(test_object == NULL)
        continue;
   if(test_class.Check(test_object))
        res=true;
  }

既然test_object被保证包含CTestObjects(除了这些对象,你没有添加任何东西,对吗?:)那么你可以通过删除ghost检查来简化代码。

CTestClass test_class;
for(int i=0;i<test_objects.Total();i++)
  {
   CTestObject *test_object = test_objects.At(i);
   bool res = test_class.Check(test_object);   
  }

而且只是简单说说。

CTestClass test_class;
for(int i=0;i<test_objects.Total();i++)
   bool res = test_class.Check((CTestObject)test_objects.At(i));
 
Juer:

好吧,如果我已经创建了一个对象的数组。也就是说,我创建了一个数组对象ArrayObj,对它进行了必要的操作。那么我不需要这个对象,但我需要里面的对象本身(数组成员),我不应该删除这个数组对象吗?

你不了解CArrayObj的用途。它是你放在里面的物体的主人。如果你删除CArrayObj,你放在里面的对象也会被删除。由于ArrayObj是这些对象的所有者,它也是它们的管理者--它控制对对象的引用,并在不再需要集合时自动删除所有分配的内存。所以你不需要释放任何东西并使用删除操作符。一切都是由CArrayObj自己完成的。CArrayObj本身在计算机中几乎不占内存(几十个字节),所以试图删除它是毫无意义的。

 
Vasiliy Sokolov:

你没有理解CArrayObj的目的。它是你放在里面的物体的主人。如果你删除了CArrayObj,那么你放在里面的对象也会被删除。由于ArrayObj是这些对象的所有者,它也是它们的管理者--它控制对对象的引用,并在不再需要集合时自动删除所有分配的内存。所以你不需要释放任何东西并使用删除操作符。一切都是由CArrayObj自己完成的。CArrayObj本身在计算机中几乎不占用任何内存(几十个字节),所以试图删除它没有任何意义。

但随后出现错误的未删除对象CArrayObj

 
Juer:

但随后出现错误的未删除对象CArrayObj

所以他们在CArrayObj上犯了一个错误。他们写了CArrayObj* test_objects 而不是CArrayObj, 但忘了为它做一个构造函数 也许他们错误地配置了内存模型来处理CArrayObj。也许程序员只是过度使用了指针。诊断很清楚:在不需要指针的地方使用指针 往往会导致泄漏。

 

你好!

你能告诉我如何将光标移动到,比如说,文本文档中的第7行,从这个位置提取一个子串 吗?

一个行的多个文本文件和一个行的多个文件哪个更快?

 
Vasiliy Sokolov:

所以他们在CArrayObj上犯了一个错误。而不是:CArrayObj test_objects; 他们写了:CArrayObj* test_objects,但忘了为它做一个析构器 也许他们错误地配置了内存模型,使之与CArrayObj一起工作。也许他们只是过度使用了指针。诊断很清楚:在不需要指针的地方使用指针 往往会导致泄漏。

但哪里根本不需要它们呢?如果你可以直接声明对象,使用它们有什么意义?

原因: