Что происходит со значениями, хранящимися в памяти, которая была динамически распределена после вызова деконструкции? - PullRequest
0 голосов
/ 24 января 2019

В последующем операторе присваивания я удаляю динамически распределяемый элемент данных класса, в котором я нахожусь. Я случайно оставил «delete» при включении кода, но, похоже, все еще работает совершенно нормально. Что именно происходит, когда я вызываю delete, и как функция swap все еще работает, если я удаляю m_itemArray перед тем, как назначить его в temp в функции Swap?

Оператор присваивания:

Set& Set::operator=(const Set& rhs)
{
    if (this != &rhs)
    {
        delete[] m_itemArray;
        Set temp(rhs);
        swap(temp);
    }
    return *this;
}

Функция обмена:

void Set::swap(Set& other)
{
    ItemType * temp = m_itemArray;
    m_itemArray = other.m_itemArray;
    other.m_itemArray = temp;
}

То, как я сейчас думаю, работает так: я даю компьютеру доступ к памяти, используемой m_itemArray, но мне повезло, потому что компьютер не редактирует то, что хранится в этом пространстве памяти к тому времени Я получаю доступ к функции обмена.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Ваша гипотеза почти наверняка верна.За исключением систем с очень высоким уровнем безопасности или при использовании отладочных систем, нет причин перезаписывать освобожденную память (что и происходит с операцией удаления).

На самом деле, даже сам выпуск может не произойтинемедленно, а лучше выполнить в более удобное время (эта операция может усложниться и стать так называемым сборщиком мусора , что, в свою очередь, может сделать использование явных выпусков ненужным - но тема усложняется).

Таким образом, до этого момента память все еще доступна и может использоваться.Даже после этого существует вероятность того, что значение не будет повторно использовано и перезаписано, и все еще будет жизнеспособным (что может способствовать скрытию того, что на самом деле является опасной ошибкой).Конечно, у вас нет никаких гарантий, и попытка получить доступ к освобожденной памяти может привести к всевозможным проблемам.

Для обнаружения ошибок такого рода в некоторых системах вы можете связать свой исполняемый файл с другим диспетчером памяти или библиотекой.это перезапишет память, которая скоро будет выпущена, случайными или контрольными значениями перед ее фактическим освобождением.В старых системах, которые не имели реальной поддержки аппаратной защиты, например, MS-DOS, это была единственная возможная проверка, и она оставалась популярным в течение некоторого времени (я помню, например, electricfence ).

0 голосов
/ 24 января 2019

Строго говоря, что удалить нечего; он больше не принадлежит, но пока что-то еще не будет записано поверх него, значения все еще будут там (для большинства распределителей). Однако попытка получить доступ к памяти, которая не выделена, является неопределенным поведением, и может произойти все что угодно.

Что именно происходит, когда я вызываю delete

Память высвобождается обратно менеджеру.

как работает функция подкачки, если я удаляю m_itemArray перед тем, как присвоить ей значение temp в функции Swap?

Просто так оно и есть. Поведение не определено.

...