MQL5 컴파일러는 클래스와 이에 대한 포인터를 구분하지 않습니다. - 페이지 4

 

그들이 평등하다는 것을

    a =b;
    b =a;
 
SemenTalonov :

그들이 평등하다는 것을

이 과제에 대해 모두 잊어 버리십시오.

 
Dmitry Fedoseev :

이 과제에 대해 모두 잊어 버리십시오.

따라서 잊어 버리는 것은 아니지만 컴파일러는 그런 쓰기를 허용해서는 안됩니다 .

그리고 현재 컴파일 뿐만 아니라 오류 없이 실행됩니다!

 
SemenTalonov :

따라서 잊어 버리는 것은 아니지만 컴파일러는 그런 쓰기를 허용해서는 안됩니다 .

그리고 현재 컴파일 뿐만 아니라 오류 없이 실행됩니다!

컴파일러는 당신이하고있는 일을 이해한다면 가능하기 때문에 허용합니다.

 
class A
{
public:
    int iValue;
    A(){Print("++");}
   ~A(){Print("--");}
};
//......................
A m_A[2];

void OnStart()
{
A a;

    m_A[0] =a; 
    m_A[1] = new A();
}

실행하고 생성자와 소멸자가 호출된 횟수와 시간을 확인합니다.

m_A[0]=아; 이 경우 다음과 같습니다. m_A[0].iValue=a.iValue;

이 경우 new A()는 새 객체를 생성하고 조건부로 temp라고 합시다. 그러면 다음이 발생합니다. m_A[1].iValue=temp.iValue;

 
Vladimir Simakov :

실행하고 생성자와 소멸자가 호출된 횟수와 시간을 확인합니다.

m_A[0]=아; 이 경우 다음과 같습니다. m_A[0].iValue=a.iValue;

이 예에서는 두 번째 줄이 올바르지 않습니다.

m_A[ 1 ] = new A();

개체에 대한 포인터를 저장할 수 없습니다. 컴파일러는 이를 인식하지 못합니다.

 
SemenTalonov :

이 예에서는 두 번째 줄이 올바르지 않습니다.

개체에 대한 포인터를 저장할 수 없습니다. 컴파일러는 이를 인식하지 못합니다.

내 게시물을 다시 읽으십시오.
 
Vladimir Simakov :

실행하고 생성자와 소멸자가 호출된 횟수와 시간을 확인합니다.

m_A[0]=아; 이 경우 다음과 같습니다. m_A[0].iValue=a.iValue;

이 경우 new A()는 새 객체를 생성하고 조건부로 temp라고 합시다. 그러면 다음이 발생합니다. m_A[1].iValue=temp.iValue;

아마도 생성자 3, 소멸자 2일 것입니다. 나머지는 정확합니다.

 
Vladimir Simakov :

다음이 발생합니다. m_A[1].iValue=temp.iValue;

벌써 4번째 해석입니다!

그렇다면 종료 시 삭제를 호출해야 하는 이유는 무엇입니까? 임시 개체의 경우?

 
SemenTalonov :

벌써 4번째 해석입니다!

그렇다면 종료 시 삭제를 호출해야 하는 이유는 무엇입니까? 임시 개체의 경우?

어쨌든 그에게 전화하지 마십시오. 순수한 메모리 누수.