-4

У меня есть класс, который включает в себя указатель std :: uint_8, и деструктор должен вызываться для удаления выделенной памяти. Проблема, с которой я сталкиваюсь, заключается в том, что возникает ошибка complier и указывается, что память не была выделена, но я знаю, что я выделил ее в своем конструкторе по умолчанию. Вот мой конструктор по умолчанию:Деструктор не удаляет выделенную память

BigInteger::BigInteger() { 
    unsigned char aArray [4]; 
    aArray[0] = 0; 
    m_number = new unsigned char[4] 
    m_number = aArray; 
    m_digitCount = 0; 
    m_sizeReserved = 4; 
} 

и вот мой деструктор:

BigInteger::~BigInteger() { 
    delete [] m_number; 
} 
+10

Что вы ожидаете от 'm_number = aArray?'? – tkausl

+0

Вы присваиваете 'm_number'' new', но на следующей строке вы назначаете его локальному массиву. –

+0

Это не только утечка памяти, но и неопределенное поведение, если позже вы используете 'm_number' – NathanOliver

ответ

2

unsigned char aArray [4] здесь вы создаете массив из 4 элементов в стеке. После завершения конструктора они исчезнут.

m_number = new unsigned char[4] Теперь вы создаете 4 элемента в куче. Вы выделяете память, и вы будете отвечать за ее очистку. Не проблема, вы делаете это в деструкторе.

m_number = aArray; Теперь вы меняете то, что m_number указывает на то, что фактически потеряло указатель на выделенную память. Теперь у вас есть утечка.

Любое использование m_number вне этого конструктора теперь является неопределенным поведением, потому что вы получаете доступ к памяти, которой у вас больше нет.

delete [] m_number; Теперь вы удаляете память, которой у вас нет. UB.

Не переназначайте m_number, и у вас не будет этих проблем. Еще лучше, используйте std::vector и следите, как эти проблемы с управлением памятью вручную тают.

0

У вас есть классический сценарий памяти утечки. В сущности, что вы делаете не является следующее:

  1. Выделяют память (m_number = new unsigned char[4])
  2. Override указатель, который указывает на этой выделенной памяти (m_number = aArray)
  3. Никогда не удалите выделенную память, как вы больше не знаете, где это - вы потеряли указатель на него (он был перезаписан)
1

Эта линия

m_number = aArray; 

присваивает адрес локальной переменной m_number.

Этот адрес не может использоваться совместно с delete [] m_number;, адрес памяти, выделенный new unsigned char[4], переопределяется и теряется после этого назначения.