MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 598

 
Juer :

여기에서 다른 개체를 추가하여 CArrayObj 개체를 만들고 있습니다. 나는 여전히 개체 자체가 필요합니다. 이 목록 개체를 삭제할 수 있습니다.

삭제하기 전에 개체를 제거하려면 어떤 방법을 사용해야 합니까? 분리() 또는 삭제() ?

또는 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 포인터를 얻습니다...

전달된 객체를 삭제하지 않고 test_class를 어떻게 삭제할 수 있습니까?

 
Vasiliy Sokolov :

메모리 할당 방법과 메모리 작업 방법을 이해하지 못하기 때문에 혼란스럽습니다. 일반적으로 CArrayObj나 그 안에 있는 개체는 수동으로 삭제할 필요가 없습니다 .

글쎄, 내가 객체의 배열을 만들었다면. 즉, ArrayObj 배열 개체가 필요한 작업을 수행했습니다. 그러면 이 개체는 필요하지 않지만 내부 개체(배열 구성원)는 필요합니다. 이 배열 개체를 삭제해야 합니까?

 

이 uv Ihor Herasko는 주말까지 지속되지만 주말에는 사용할 수 없습니다. )

질문은 지난 목요일부터 매달려 있습니다! :)

나는 여전히 내 리뷰에 대한 책임이 있고 나는 당신에게 좋은 리뷰를 주었습니다. 좋은, 당신의 게임을 끝내십시오 "나는 하루에 1개의 질문에 대답합니다", 왜냐하면 나는 기대에 만족하지 않고 그다지 좋지 않기 때문입니다 내 리뷰를 수정하는 데 능숙합니다. 이 속도로는 다음 주 내내 기다려야 하고 부엉이를 프리랜서에게 수정을 맡겨야 합니다. )
 
Juer :

나는 객체를 클래스 함수에 전달하고 이에 대한 참조를 전달하여 함수의 작업이 객체와 함께 발생한 다음 반환되도록 합니다. 그리고 더 이상 클래스 개체 자체가 필요하지 않습니다... 어떻게 삭제할 수 있습니까?

다소 이렇습니다. 여기에서 test_class를 삭제하고 있습니다. 다음 반복에서 Invalid 포인터를 얻습니다...

전달된 객체를 삭제하지 않고 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는 이러한 개체의 소유자이기 때문에 개체의 관리자이기도 합니다. 개체 참조를 제어하고 컬렉션이 더 이상 필요하지 않은 경우 할당된 모든 메모리를 자동으로 삭제합니다. 따라서 아무것도 해제하고 삭제 연산자 를 사용할 필요가 없습니다. 모든 것은 CArrayObj 자체에 의해 수행됩니다. CArrayObj 자체는 실제로 컴퓨터의 메모리(수십 바이트)를 차지하지 않으므로 삭제하려고 하는 것은 무의미합니다.

 
Vasiliy Sokolov :

CArrayObj의 목적을 이해하지 못합니다. 이것은 당신이 거기에 배치한 개체의 소유자입니다. CArrayObj를 삭제하면 그 안에 배치한 객체도 삭제됩니다. ArrayObj는 이러한 개체의 소유자이기 때문에 개체의 관리자이기도 합니다. 개체 참조를 제어하고 컬렉션이 더 이상 필요하지 않은 경우 할당된 모든 메모리를 자동으로 삭제합니다. 따라서 아무것도 해제하고 삭제 연산자 를 사용할 필요가 없습니다. 모든 것은 CArrayObj 자체에 의해 수행됩니다. CArrayObj 자체는 실제로 컴퓨터의 메모리(수십 바이트)를 차지하지 않으므로 삭제하려고 하는 것은 무의미합니다.

그러나 오류가 삭제되지 않은 개체 CArrayObj

 
Juer :

그러나 오류가 삭제되지 않은 개체 CArrayObj

그래서 그들은 CArrayObj를 망쳤습니다. 대신: CArrayObj test_objects; 그들은 다음과 같이 썼습니다. CArrayObj* test_objects , 그러나 소멸자를 만드는 것을 잊었습니다 . 아마도 메모리 모델이 CArrayObj와 함께 작동하도록 잘못 구성되었을 수 있습니다. 아마도 그들은 포인터로 그것을 과장했을 것입니다. 진단은 분명합니다. 포인터가 필요하지 않은 곳에 포인터를 사용 하면 종종 누출이 발생합니다.

 

안녕하세요!

이 위치에서 이미 부분 문자열을 추출 하기 위해 텍스트 문서의 7행과 같이 커서를 이동하는 방법을 알려주십시오.

한 줄로 된 많은 텍스트 파일과 여러 줄로 된 하나의 파일 중 어느 것이 더 빠를까요?

 
Vasiliy Sokolov :

그래서 그들은 CArrayObj를 망쳤습니다. 대신: CArrayObj test_objects; 그들은 다음과 같이 썼습니다. CArrayObj* test_objects , 그러나 소멸자를 만드는 것을 잊었습니다 . 아마도 메모리 모델이 CArrayObj와 함께 작동하도록 잘못 구성되었을 수 있습니다. 아마도 그들은 포인터로 그것을 과장했을 것입니다. 진단은 분명합니다. 포인터가 필요하지 않은 곳에 포인터를 사용 하면 종종 누출이 발생합니다.

그들은 어디에 전혀 필요합니까? 객체를 선언할 수 있을 때 사용하는 요점은 무엇입니까?