close
Пространства имён
Варианты
Действия

std::free

Материал из cppreference.com
< cpp | memory | c
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
 
<tbody> </tbody>
Определено в заголовочном файле <cstdlib>
void free( void* ptr );

Освобождает память, ранее выделенную std::malloc(), std::calloc() или std::realloc().

Если ptr является нулевым указателем, то функция ничего не делает.

Поведение не определено, если значение ptr не равно значению, возвращенному ранее std::malloc, std::calloc, std::aligned_alloc (начиная с C++17) или std::realloc.

Поведение не определено, если область памяти, на которую ссылается ptr, уже была освобождена, то есть std::free() или std::realloc() уже были вызваны с ptr в качестве аргумента, и никакие вызовы std::malloc(), std::calloc() или std::realloc() впоследствии не приводят к указателю, равному ptr.

Поведение не определено, если после возврата из std::free() через указатель ptr осуществляется доступ (если только другая функция распределения не привела к значению указателя, равному ptr)

Следующие функции должны быть потокобезопасными:

  • Библиотечные версии operator new и operator delete
  • Пользовательские заменяющие версии глобальных operator new и operator delete
  • std::calloc, std::malloc, std::realloc, std::aligned_alloc (начиная с C++17), std::free

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

(начиная с C++11)

Параметры

ptr указатель для освобождения памяти

Возвращаемое значение

(нет)

Примечание

Функция принимает (и ничего с ним не делает) нулевой указатель, чтобы уменьшить количество специальных случаев. Независимо от того, удалось выделение или нет, указатель, возвращаемый функцией выделения, может быть передан std::free().

Пример

#include <cstdlib>

int main()
{
    int* p1 = (int*)std::malloc(10*sizeof *p1);
    std::free(p1); // каждый выделенный указатель должен быть освобождён

    int* p2 = (int*)std::calloc(10, sizeof *p2);
    int* p3 = (int*)std::realloc(p2, 1000*sizeof *p3);
    if(!p3) // p3 равный нулю означает, что перераспределение не удалось,
            // и p2 должен быть освобождён.
       std::free(p2);
    std::free(p3); // p3 может быть освобождён независимо от того,
                   // является ли он нулевым.
}

Смотрите также