std::free
| Определено в заголовочном файле <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)
|
Следующие функции должны быть потокобезопасными:
Вызовы этих функций, которые выделяют или освобождают конкретную единицу памяти, происходят в одном общем порядке, и каждый такой вызов освобождения происходит до следующего выделения памяти (если таковое имеется) в этом порядке. |
(начиная с 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 может быть освобождён независимо от того,
// является ли он нулевым.
}
Смотрите также
Документация C по free
|