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

 
uncleVic :
문제... 신호 모듈을 부착하십시오(저는 없습니다). 우리는 볼 것이다.
파일:
 
openlive :

더 이상합니다. 효과가 나에게 효과가 없습니다.
 
uncleVic :

더 이상합니다. 나는 효과를 얻지 못한다.

초기화 중에만 효과가 있으며 테스터에서는 모든 것이 정상입니다.

좋아, 고를 필요 없어, 난 별로 필요 없어

 

지그재그 표시기에서 더 이상 존재하지 않는 값을 읽습니다(아마 다시 그리기 전에 있었던 것 같습니다).이를 피할 수 있습니까?

버퍼에 값이 있으면 다시 그리지 않는 이유는 ...

[삭제]  

안녕하세요, 다음을 설명해 주십시오.

 class Cbase
{
public :
         virtual ~Cbase(){};
         int k;
};

class Cchild: public Cbase
{
public :
        ~Cchild(){};
         double *p;
         int f;
};

두 개의 클래스가 있습니다. 차세대 인스턴스( base - child - child2 - ...)가 메모리에서 점점 더 많은 공간을 차지한다고 생각합니다. New 연산자에게 우리는 매개변수에 클래스를 전달하여 할당할 메모리의 양을 정확히 알려줍니다. 그러나 삭제 연산자 에서 우리는 삭제할 양에 대해 아무 말도 하지 않습니다. 이러한 반성을 바탕으로 다음 상황에서 어떤 일이 일어날지 완전히 명확하지 않습니다.

 void fn()
{
   Cbase *pClass;
   pClass = new Cchild;
   delete pClass;
   return ;
}

저것들. 내 말은, 우리는 *pClass를 Cbase(Cchild에 비해 작은 클래스)에 대한 포인터로 선언했지만 실제로는 Cchild를 가리킵니다. 여기에서 질문은 delete()가 어떻게 작동합니까? Cbase 의 크기와 동일한 바이트 수를 해제할 것인가(메모리가 막힐 것인가), 아니면 삭제가 올바르게 일어날 것인가?

추신: 글쎄, 주제에 대한 한 가지 질문에 대해: 할당된 메모리 영역(신규)에 이 영역의 크기를 이해할 수 있는 일종의 레이블이 있습니까? 끝)? 다시 말해, 내가 올바르게 선언한 클래스의 크기에 대해 아무것도 모르는 코드가 메모리를 해제할 수 있습니까?

 

220Volt :

여기에서 질문은 delete()가 어떻게 작동합니까? Cbase 의 크기와 동일한 바이트 수를 해제할 것인가(메모리가 막힐 것인가), 아니면 삭제가 올바르게 일어날 것인가?

물론 올바르게 제거됩니다. 소멸자에 중단점을 분산할 수 있습니다.

추신: 글쎄, 주제에 대한 한 가지 질문에 대해: 할당된 메모리 영역(신규)에 이 영역의 크기를 이해할 수 있는 일종의 레이블이 있습니까? 끝)? 다시 말해, 내가 올바르게 선언한 클래스의 크기에 대해 아무것도 모르는 코드가 메모리를 해제할 수 있습니까?

크기?
[삭제]  
sergeev :

물론 올바르게 제거됩니다. 소멸자에 중단점을 분산할 수 있습니다.

이 질문에는 거기에서 자라는 다리가 있습니다. 설명된 대로 대략적으로 수행했으며(소멸자는 가상이 아님) 포인터 클래스 아래의 소멸자는 호출되지 않았습니다.
[삭제]  
sergeev :
크기?
나는 sizeof가 컴파일 타임에 작동한다고 생각하고 예를 들어 다른 프로세스에서 메모리를 해제 하는 것에 대해 이야기하고 있습니다. 이것이 가능하다면 삭제 기능의 작업이 명확해질 것이라고 생각합니다.
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
  • www.mql5.com
Основы языка / Операторы / Оператор уничтожения объекта delete - Документация по MQL5
 
MQL5의 소멸자는 항상 가상입니다. 모든 것이 올바르게 삭제되었습니다. Print (__FUNCSIG__)를 내려놓으십시오. 소멸자에서.

 class CFoo
  {
public :
   ~CFoo() { Print ( __FUNCSIG__ ); }
  };

class CBar : public CFoo
  {
public :
   ~CBar() { Print ( __FUNCSIG__ ); }
  };

void OnStart ()
  {
   CFoo *f= new CBar();
   
   delete f;   
  }
[삭제]  
문제는 new를 통해 클래스 함수에 할당한 항목에 대한 것이 아니라 클래스의 "루트" 멤버인 데이터에 대한 것입니다. 결국 그것들도 빈 공간이 아니다.