Стандартные программы освобождения памяти касаются освобождаемого блока?

Это потому, что setTimeout не возвращает обещание await в вашей функции main. Сам setTimeout выполняется синхронно. Он добавляет к циклу событий обратный вызов, который передается в качестве аргумента для выполнения в указанное время.

Также в этом коде возврат вашего обратного вызова ничего не значит, так как обратный вызов будет запущен в течение 1 секунды, и возвращаемое значение не будет никуда.

Ключевое слово

async говорит вам, что функции возвращают обещание и могут содержать await код. Таким образом, поскольку в вашем коде нет ожидания, он выглядит как

function moveOneStepAsync() {
  setTimeout(() => {
    return console.log('Hello world!');
  }, 1000);
  return Promise.resolve();
}

. Таким образом, ваш await в основном будет ожидать один тик цикла событий, чтобы перейти к следующему «шагу»

Читать о setTimeout, цикле событий и о том, что ожидает, чтобы понять его более подробно

5
задан Constantin 18 February 2010 в 06:47
поделиться

3 ответа

Я провел тест для HeapFree . Следующая программа имеет нарушение прав доступа внутри HeapFree при i = 31999:

#include <windows.h>

int main() {

    HANDLE heap = GetProcessHeap();
    void * bufs[64000];

    // populate heap
    for (unsigned i = 0; i < _countof(bufs); ++i) {
        bufs[i] = HeapAlloc(heap, 0, 4000);
    }

    // protect a block in the "middle"
    DWORD dwOldProtect;
    VirtualProtect(
        bufs[_countof(bufs) / 2], 4000, PAGE_NOACCESS,
        &dwOldProtect);

    // free blocks
    for (unsigned i = 0; i < _countof(bufs); ++i) {
        HeapFree(heap, 0, bufs[i]);
    }
}

Стек равен

ntdll.dll!_RtlpCoalesceFreeBlocks@16()  + 0x12b9 bytes  
ntdll.dll!_RtlFreeHeap@12()  + 0x91f bytes  
shutfree.exe!main()  Line 19    C++

Таким образом, похоже, что ответ - «Да» (это относится к свободным , поскольку ну, поскольку он использует HeapFree внутри)

1
ответ дан 14 December 2019 в 19:28
поделиться

Если Вы чисто не освободите все свои ресурсы на завершении работы приложения, то оно сделает его почти на невозможном, чтобы обнаружить, если у Вас будут какие-либо действительно серьезные проблемы - как утечки памяти - который был бы большим количеством проблемы, чем медленное закрытие. Если UI исчезнет быстро, то пользователь будет думать, что это закрылось быстро, даже если это имеет большую работу все еще, чтобы сделать. С UI восприятие скорости более важно, чем действительная скорость. Когда пользователь выбирает опцию 'Exit Application', окно главного приложения должно сразу исчезнуть. Не имеет значения, если приложение займет несколько секунд после этого к свободному все выход корректно, то пользователь не заметит.

4
ответ дан 14 December 2019 в 19:28
поделиться

Я почти уверен, что ответ на вопрос об улучшении скорости был бы "да". Освобождение блока может или не может коснуться фактического рассматриваемого блока, но это должно будет, конечно, обновить другую бухгалтерскую информацию в любом случае. Если у Вас есть огромное количество маленьких выделенных объектов (это происходит), то усилие, требуемое освободить их всех, могло оказать значительное влияние.

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

0
ответ дан 14 December 2019 в 19:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: