Любые вопросы новичков по 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 удаляю, мне пишет Invalid pointer при следующей итерации...

Как мне удалить test_class, не удаляя переданного в него объекта?

 
Vasiliy Sokolov:

У Вас путаница из-за не понимания как выделяется память и как с ней нужно работать. В общем случае ни CArrayObj ни объекты располагающиеся в нем, удалять в ручную не нужно

Ну если я создал массив объектов. То есть объект массива ArrayObj, проделал с ним необходимые действия. Затем мне этот объект не нужен, а сами объекты внутри (члены массива) нужны, я же должен удалить этот объект массива?

 

Этот ув Ihor Herasko дотянет до выходных, а на выходных его нет ; )

с прошлого четверга вопросы висят! : )

я всё-таки отвечаю за свои отзывы, а Вам я дал хороший отзыв, будьте милы, закончите Вашу игру а-ля "отвечаю на 1 вопрос в день", потому что я не в восторге от ожидания, и отзыв я свой корректировать не очень хочу. такими темпами мне придется ждать всю следующую неделю, а мне нужно сову отдавать фрилансеру на доработку ; ) 
 
Juer:

Я передаю в функцию класса объект, ссылку на него, чтобы с ним произошли действия в функции, а затем вернулся бы он. А сам объект класса мне более не нужен... Вот как мне его удалить?

Примерно так. Вот я как test_class удаляю, мне пишет Invalid pointer при следующей итерации...

Как мне удалить 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 гарантированно содержит объекты CTestObject (вы же ничего кроме этих объектов туда не добавляли, правда?:) То код можно еще упростить, убрав проверку приведения:

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 владелец этих объектов, то он же является их менеджером - контролирует ссылки на объекты и в автоматическом режиме удаляет все выделенную память в случаи, когда коллекция больше не нужна. Поэтому Вам не нужно ничего осовобождать и использовать оператор delete. Все делает сам CArrayObj. Сам CArrayObj практически не занимает памяти в компьютере (несколько десятков байт) и поэтому стремится к его удалению бессмысленно.

 
Vasiliy Sokolov:

Вы не понимаете назначение CArrayObj. Это владелец объектов, которые Вы в него размещаете. Удалите CArrayObj тогда и объекты, которые Вы в него разместили также удалятся. Раз ArrayObj владелец этих объектов, то он же является их менеджером - контролирует ссылки на объекты и в автоматическом режиме удаляет все выделенную память в случаи, когда коллекция больше не нужна. Поэтому Вам не нужно ничего осовобождать и использовать оператор delete. Все делает сам CArrayObj. Сам CArrayObj практически не занимает памяти в компьютере (несколько десятков байт) и поэтому стремится к его удалению бессмысленно.

Однако потом ошибки undeleted objects CArrayObj

 
Juer:

Однако потом ошибки undeleted objects CArrayObj

Значит накосячили с CArrayObj. Вместо: CArrayObj test_objects; Написали: CArrayObj* test_objects, а диструктор для него забыли сделать; Возможно неправильно сконфигурировали модель памяти по работе с CArrayObj. Может просто с указателями перемудрили. Диагноз однозначный: использование указателей там, где они не нужны, часто приводит к утечкам. 

 

Здравствуйте!

Подскажите пожалуйста как перенести курсор ,скажем на 7 строчку в текстовом документе,для извлечения подстроки уже с этой позиции...

Что будет быстрее-много текстовых файлов с одной строкой или один файл с большим количеством строк?

 
Vasiliy Sokolov:

Значит накосячили с CArrayObj. Вместо: CArrayObj test_objects; Написали: CArrayObj* test_objects, а диструктор для него забыли сделать; Возможно неправильно сконфигурировали модель памяти по работе с CArrayObj. Может просто с указателями перемудрили. Диагноз однозначный: использование указателей там, где они не нужны, часто приводит к утечкам. 

А где они нужны вообще? Какой смысл в их использовании, если можно просто объявлять объекты?

Причина обращения: