MQL5의 OOP에 대한 질문 - 페이지 4

 
Dmitry Fedoseev :
& 없이 참조가 아닌 포인터를 전달할 수도 있습니다.
할 수 있다. & 없이 포인터를 전달하는 경우에만 전달된 값이 할당된 스택에 새 포인터가 생성됩니다. 동시에 함수에서 이 포인터에 따라 메모리를 할당하면 스택에 생성된 포인터가 각각 변경되고 스택이 "풀기"되면 메모리 누수가 발생합니다. 물론 이렇게 하는 것은 좋지 않지만, 하고 싶은 사람이 있다면...
 
Vladimir Simakov :
그런 다음 포인터는 스택에서 생성된 포인터를 각각 정확히 변경합니다. 스택이 "풀리면" 메모리 누수가 발생합니다. 물론 이렇게 하는 것은 좋지 않지만, 하고 싶은 사람이 있다면...

MQL에서 클래스에 대한 포인터의 동작은 예측할 수 없습니다. 관리자 중 한 명이 한 번 모든 클래스가 전역 메모리(메모리 할당)에서 생성된다고 썼고, 로컬 가시성의 클래스에 대한 포인터가 스택에 생성된다고 씁니다(IMHO, 이것은 어떻게 해야! )

비록 내가 뭔가를 혼동하고 있을지 모르지만 아마도 나는 그것을 확인할 것입니다 - 이론상 확인하는 것은 어렵지 않습니다. 테스트 클래스의 소멸자에 Print() 를 작성하는 것으로 충분합니다. 소멸자는 로컬 범위를 벗어날 때 자동으로 호출되어야 합니다. ..

 
Vladimir Simakov :
할 수 있다. & 없이 포인터를 전달하는 경우에만 전달된 값이 할당된 스택에 새 포인터가 생성됩니다. 동시에 함수에서 이 포인터에 따라 메모리를 할당하면 스택에 생성된 포인터가 각각 변경되고 스택이 "풀기"되면 메모리 누수가 발생합니다. 물론 이렇게 하는 것은 좋지 않지만, 하고 싶은 사람이 있다면...

누출이 없을 것입니다. 함수에서 아무도 해당 포인터에 대해 아무 것도 할당하지 않기 때문입니다.

 
Igor Makanu :

MQL에서 클래스에 대한 포인터의 동작은 예측할 수 없습니다. 관리자 중 한 명이 한 번 모든 클래스가 전역 메모리(메모리 할당)에서 생성된다고 썼고, 로컬 가시성의 클래스에 대한 포인터가 스택에 생성된다고 씁니다(IMHO, 이것은 어떻게 해야! )

제가 뭔가 헷갈리긴 하지만 확인해볼께요 - 이론상 확인은 어렵지 않고 테스트 클래스의 소멸자에 Print() 를 작성하면 충분합니다. 소멸자는 로컬 범위를 벗어날 때 자동으로 호출되어야 합니다. .

메모리가 동적으로(새로) 할당되면 힙에 할당되고 스택(CObj obj;)에 개체를 만들면 스택에서도 메모리가 할당됩니다.

 
Dmitry Fedoseev :

누출이 없을 것입니다. 함수에서 아무도 해당 포인터에 대해 아무 것도 할당하지 않기 때문입니다.

 void CreateLabel(CChartObjectLabel *l, string name, int y)
  {
   l= new CChartObjectLabel;
   l.Create( 0 ,name, ChartWindowFind (), 0 ,y);
   l.Color( clrYellow );
   l.FontSize( 14 );
   l.Description(name);
  }

고전적인 누출. 스택에서 생성되고 함수에 전달된 값으로 생성 시 초기화된 포인터에는 새 값이 할당되고 새 개체에 대한 포인터가 되었습니다. 그 후, 포인터는 스택 해제 중에 안전하게 종료되었습니다. Q.E.D. 이것이 정확히 있어야 할 위치입니다:

 void CreateLabel(CChartObjectLabel* &l, string name, int y)
 
Vladimir Simakov :

메모리가 동적으로(새로) 할당되면 힙에 할당되고 스택(CObj obj;)에 개체를 만들면 스택에서도 메모리가 할당됩니다.

mql에는 그런 것이 없습니다 - (CObj obj;)

 
Vladimir Simakov :

고전적인 누출. 스택에서 생성되고 함수에 전달된 값으로 생성 시 초기화된 포인터에는 새 값이 할당되고 새 개체에 대한 포인터가 되었습니다. 그 후, 포인터는 스택 해제 중에 안전하게 종료되었습니다. Q.E.D. 이것이 정확히 있어야 할 위치입니다:

하나님의 선물을 스크램블 에그와 혼동하지 마십시오. 게다가 틀린 문장을 확인하기 위해 바보 같은 코드를 작성하는 ...

 
Dmitry Fedoseev :

mql에는 그런 것이 없습니다 - (CObj obj;)

어서 해봐요! 그것이 내가 항상 사용하는 것입니다.
 
Vladimir Simakov :
 void CreateLabel(CChartObjectLabel *l , string name, int y)
  {
   l= new CChartObjectLabel ;
   l.Create( 0 ,name, ChartWindowFind (), 0 ,y);
   l.Color( clrYellow );
   l.FontSize( 14 );
   l.Description(name);
  }

고전적인 누출. 스택에서 생성되고 함수에 전달된 값으로 생성 시 초기화된 포인터에는 새 값이 할당되고 새 개체에 대한 포인터가 되었습니다. 그 후, 포인터는 스택 해제 중에 안전하게 종료되었습니다. Q.E.D. 이것이 정확히 있어야 할 위치입니다:

그리고 함수에 전달 된 포인터를 의도적으로 재할당한 이유는 무엇입니까? 물론 누수가 있을 것입니다. 그러나 이것은 "고전적인 누출"이 아니라 개체에 대한 포인터로 작업하는 고전적인 오류입니다.

여기서 새 개체를 만들 필요는 없지만 외부 개체로 작업해야 하며 이 개체에 대한 포인터가 함수에 전달됩니다.

 
Vladimir Simakov :
어서 해봐요! 그것이 내가 항상 사용하는 것입니다.

어디에? 어디서 어떻게?