찻주전자의 질문 - 페이지 107

 
mql5 :
MQL5의 소멸자는 항상 가상입니다. 모든 것이 올바르게 삭제되었습니다. Print(__ FUNCSIG __)를 내려놓으십시오. 소멸자에서.


VC++로 했는데 메모리 해제 메커니즘이 같은 것 같아요?
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
  • www.mql5.com
Основы языка / Операторы / Оператор уничтожения объекта delete - Документация по MQL5
 
220Volt :
VC++로 했는데 메모리 해제 메커니즘이 같은 것 같아요?
아니요, C++에서 삭제를 통해 개체를 올바르게 삭제하려면 가상 소멸자를 지정해야 합니다.

그러나 귀하의 예는 올바르게 작동합니다. 왜냐하면. 기본 클래스의 가상 소멸자를 지정할 수 있습니다.
 

아이디어를 조금 다르게 표현하려고 합니다.

주어진:

  • 클래스 번호 1 - 메모리에서 100바이트를 차지합니다.
  • 클래스 번호 2 - 클래스 번호 1의 후속 제품으로 메모리에서 200바이트를 차지합니다.
  • 클래스 #1에 대한 포인터.

행위:

  • 클래스 번호 2의 인스턴스가 있는 메모리 영역의 주소를 포인터에 씁니다(new라고 함).
  • 포인터에 저장된 주소를 삭제 기능에 전달하여 납땜 영역을 해제합니다.

추신: 그림은 메모리 모델을 보여줍니다)

 
클래스 번호 1에 대한 포인터 때문에 의심되지만 실제로는 메모리 클래스 번호 2에 있습니다. 실제로 소멸자가 있는 경우에는 이것이 중요하기 때문에 갑자기 여기에 문제가 있을 수 있다고 생각했습니다. 그런 상황에서 메모리에 표시가 있는 경우(예: null 종결자가 있는 char) 또는 이와 유사한 경우에만 올바른 메모리 해제가 발생할 수 있다고 생각합니다. 그래서 메모리 할당 방법에 대해 질문했습니다.
 
220Volt :
클래스 번호 1에 대한 포인터 때문에 의심되지만 실제로는 메모리 클래스 번호 2에 있습니다. 실제로 소멸자가 있는 경우에는 이것이 중요하기 때문에 갑자기 여기에 문제가 있을 수 있다고 생각했습니다. 그런 상황에서 메모리에 표시가 있는 경우(예: null 종결자가 있는 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;
  }
//+------------------------------------------------------------------+

삭제와 같은 위협 구성 자체는 단계적으로 발생하며 이 모든 정보가 저장되고(가상 포인터 자체, 클래스가 기본 및 하위 항목의 합성으로 구성되었음을 기억하십시오) 삭제할 때 소멸자가 반대로 호출됩니다. 나중에서 더 이른 순서로.

 
그것은 소멸자에 관한 것이 아니며, 중요한 것이 아니며, 클래스 자체에 관한 것입니다. 더 많은 바이트가 필요합니다. 200바이트를 할당한 다음 포인터가 가리키는 메모리를 해제하라고 말합니다. 포인터는 100바이트의 개체를 나타냅니다.
 
220Volt :
그것은 소멸자에 관한 것이 아니며, 중요한 것이 아니며, 클래스 자체에 관한 것입니다. 더 많은 바이트가 필요합니다. 200바이트를 할당한 다음 포인터가 가리키는 메모리를 해제하라고 말합니다. 포인터는 100바이트의 개체를 나타냅니다.
내가 이해하는 한 귀하의 질문은 메모리 풀의 기능과 관련이 있습니다.
예, 메모리 풀은 삭제 호출로 조각이 해제되는 기간을 알고 있습니다.
이 정보가 저장되는 위치는 풀 구현에 따라 다릅니다.

예를 들어, C++에서 new를 통해 할당되지 않은 개체에 대한 포인터를 제공하면 응용 프로그램이 어떻게 충돌하는지 알 수 있습니다.
 
220Volt :
그것은 소멸자에 관한 것이 아니며, 중요한 것이 아니며, 클래스 자체에 관한 것입니다. 더 많은 바이트가 필요합니다. 200바이트를 할당한 다음 포인터가 가리키는 메모리를 해제하라고 말합니다. 포인터는 100바이트의 개체를 나타냅니다.
나는 당신이 내 예를 시작하지 않았다는 것을 이해했습니다. 그렇지 않으면 그러한 질문이 없을 것입니다.
 
예를 들어 int 배열에 메모리를 할당한 다음 int 하나가 작다는 사실에도 불구하고 모든 것을 삭제할 수 있다는 것을 기억했습니다. 아마도 클래스도 마찬가지일 것입니다. 답변 감사합니다.
 
mql5 :
내가 이해하는 한 귀하의 질문은 메모리 풀의 기능과 관련이 있습니다.
예, 메모리 풀은 삭제 호출로 조각이 해제되는 기간을 알고 있습니다.
이 정보가 저장되는 위치는 풀 구현에 따라 다릅니다.

예를 들어, C++에서 new를 통해 할당되지 않은 개체에 대한 포인터를 제공하면 응용 프로그램이 어떻게 충돌하는지 알 수 있습니다.
그게 다야, 고마워.