Помогите разобраться (баг или я не понимаю чего?)

 

Всем привет, сразу к делу. Есть синтетический пример скрипта:

class IntValue
{
        private:
                int m_value;
                
        public:
                IntValue() { m_value = 0; }
                IntValue(const IntValue &another) { this = another; }
                IntValue(const int value) { m_value = value; }

                void Value(const int value) { m_value = value; }
                int Value() const { return m_value; }

                void operator=(const IntValue &another) { m_value = another.Value(); }
                bool operator==(const IntValue &another) const { return (m_value == another.Value()); }
                bool operator!=(const IntValue &another) const { return !(another == this); }
};

class TestClass
{
        private:
                IntValue m_value;
                
        public:
                TestClass()
                {
                   IntValue zero(0);
                   m_value = zero;
                }
                TestClass(const TestClass &another) { this = another; }
                TestClass(const IntValue &value) { m_value = value; }

                void Value(const IntValue &value) { m_value = value; }
                IntValue Value() const { return m_value; }

                void operator=(const TestClass &another) { m_value = another.Value(); }
                bool operator==(const TestClass &another) const { return (m_value == another.Value()); }
                bool operator!=(const TestClass &another) const { return !(another == this); }
};

void OnStart()
{
    IntValue zero(0);
    IntValue ten(10);
    
    TestClass zeroTestObject(zero);
    TestClass testObject(ten);            
    
    while(testObject.Value() != zero)
    {    
      // do something  
      testObject = zeroTestObject;
    }  
}

Он даёт такой вывод (MQL4/5 - одинаково), для меня неожиданное поведение:

2018.09.28 12:32:59.691 Test (EURUSD,H1)        1 undeleted objects left
2018.09.28 12:32:59.694 Test (EURUSD,H1)        1 object of type IntValue left

Однако, если запустить такой вариант функции OnStart:

void OnStart()
{
    IntValue zero(0);
    IntValue ten(10);
    
    TestClass zeroTestObject(zero);
    TestClass testObject(ten);            
    
    while(true)
    {
       if(testObject.Value() != zero)
       {    
         // do something  
         testObject = zeroTestObject;
       }
       else
       {
         break;
       }
    } 
}

...то никаких утечек памяти (это для меня как раз ожидаемое поведение).

Вопрос - это какой-то баг или я замыленным взглядом не вижу какого-то своего очевидного косяка? Разве не должны циклы давать одинаковое поведение (пусть бы и с утечками памяти, но одинаковое)?

Проверено в MetaEditor & MT5 build 1881 и в MetaEditor build 1861 & MT4 build 1126.

 
Sergey Eremin:

Вопрос - это какой-то баг или я замыленным взглядом не вижу какого-то своего очевидного косяка?

Это баг, т.к. временный объект класса не уничтожается. Пока можно обойти таким образом

//                IntValue Value() const { return m_value; }
                const IntValue* Value() const { return &m_value; }
 
fxsaber:

Это баг, т.к. временный объект класса не уничтожается. Пока можно обойти таким образом

Благодарю за ответ! Нечто подобное о временном объекте предполагал, но сомневался. Это уже где-то обсуждалось, как я понимаю? Обещали поправить?

 
Sergey Eremin:

Благодарю за ответ! Нечто подобное о временном объекте предполагал, но сомневался. Это уже где-то обсуждалось, как я понимаю? Обещали поправить?

Не помню такого обсуждения.

 
fxsaber:

Не помню такого обсуждения.

Понял, спасибо!