Я использую программу MVS 2010, C ++ без использования CRT.
Реализация поиска расширения файла:

LPWSTR findExtension(LPCWSTR fileName) 
{
    int pos = findchr(fileName, L".");
    if (pos != -1) {
        int lenght = lstrlenW(fileName);
        wchar_t* extension = (wchar_t*)HeapAlloc(GetProcessHeap(), NULL, lenght - pos + 1);
        for (int i = 0; i < lenght - pos; i++)
        {
            extension[i] = fileName[pos + 1 + i];
        }
        extension[lenght - pos] = 0;
        LPWSTR ret = extension;

        return ret;
    }
}

Есть проблемы. Иногда это может привести к сбою приложения. И утечка памяти. Как решить эту проблему?

-1
korozya 18 Фев 2020 в 15:18

2 ответа

Лучший ответ

Ваша проблема:

int lenght = lstrlenW(fileName);

lenght - это число широких символов, а не количество байтов. Таким образом, вы выделяете слишком маленький буфер здесь:

wchar_t* extension = (wchar_t*)HeapAlloc(GetProcessHeap(), NULL, lenght - pos + 1);

Вам нужно использовать это вместо:

wchar_t* extension = (wchar_t*)HeapAlloc(GetProcessHeap(), NULL, sizeof(wchar_t) * (lenght - pos + 1));
2
drescherjm 18 Фев 2020 в 12:56

Функция HeapAlloc() будет выделять память в куче. Когда вы не используете блок памяти кучи, вам нужно освободить его. Вы можете использовать:
BOOL HeapFree( HANDLE hHeap,DWORD dwFlags,_Frees_ptr_opt_ LPVOID lpMem);

Даже если вы находитесь в модуле {....}, куча не будет вести себя так же, как стек , что он автоматически FREE будет использовать свою память. Чем больше вы используете функцию, тем больше она будет выделять памяти для кучи, и ваш private memory size (см. Диспетчер задач) будет расти и увеличиваться. И к тому времени, когда ОС не может дать вам память, она внезапно рухнет.

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

-1
Master James 18 Фев 2020 в 13:06