Поделиться через


C26115

Предупреждение C26115: Не удалось освободить блокировку <блокировка> в функции <функция>.

Синтаксическое выделение области блокировки между парными acquire и release в программах C/C++ не требуется.Функция может добиться побочного эффекта блокировки внесением наблюдаемых изменений в состояние параллелизма.Например, функция-оболочка блокировки для данной блокировки увеличивает число захватов блокировки или количество блокировок.

Функцию, которая имеет дело с захватом блокировки или освобождением блокировки, можно аннотировать с помощью _Acquires_lock_ или _Releases_lock_ соответственно.При отсутствии этих аннотаций предполагается, что функция не изменяет количество блокировок после своего завершения.Если захваты и освобождения не сбалансированы, то они считаются осиротевшими.Предупреждение C26115 выводится, когда функция инициирует осиротевшую блокировку.

Пример

Следующий пример приводит к предупреждению C26115, поскольку в нем присутствует осиротевшая блокировка в функции, которая не аннотируется как _Acquires_lock_.

    typedef struct _DATA 
    {
        CRITICAL_SECTION cs;
    } DATA;

    void FailToReleaseLock(int flag, DATA* p) 
    {
        EnterCriticalSection(&p->cs); 

        if (flag)
            return; // Warning C26115

        LeaveCriticalSection(&p->cs);
    }