free_sized
|
Определено в заголовочном файле
<stdlib.h>
|
||
|
void
free_sized
(
void
*
ptr,
size_t
size
)
;
|
(начиная с C23) | |
Освобождает пространство, ранее выделенное с помощью malloc() , calloc() или realloc() (но не aligned_alloc() ).
|
Этот раздел не завершён
Причина: унифицировать формулировки для семейства `free_*` |
free_sized
является потокобезопасной: она ведет себя так, как если бы обращалась только к ячейкам памяти, доступным через свой аргумент, и не затрагивала никакое статическое хранилище.
Вызов
free_sized
, который освобождает область памяти,
синхронизируется-с
вызовом любой последующей функции выделения памяти, которая выделяет ту же самую или часть той же области памяти. Эта синхронизация происходит после любого доступа к памяти со стороны освобождающей функции и до любого доступа к памяти со стороны функции выделения. Существует единый полный порядок всех функций выделения и освобождения памяти, работающих с каждой конкретной областью памяти.
Содержание |
Параметры
| ptr | - | указатель на память для освобождения |
| size | - | размер памяти, ранее переданный функции выделения |
Возвращаемое значение
(нет)
Примечания
| Этот раздел не завершён |
Возможная реализация
Пример
#include <stddef.h> #include <stdio.h> #include <stdlib.h> typedef struct { size_t size; // текущее количество элементов size_t capacity; // зарезервированное количество элементов void** data; } PtrVector; PtrVector vector_create(size_t initial_capacity) { PtrVector ret = { .capacity = initial_capacity, .data = (void**) malloc(initial_capacity * sizeof(void*)) }; return ret; } void vector_delete(PtrVector* self) { free_sized(self->data, self->capacity * sizeof(void*)); } void vector_push_back(PtrVector* self, void* value) { if (self->size == self->capacity) { self->capacity *= 2; self->data = (void**) realloc(self->data, self->capacity * sizeof(void*)); } self->data[self->size++] = value; } int main() { int data = 42; float pi = 3.141592f; PtrVector v = vector_create(8); vector_push_back(&v, &data); vector_push_back(&v, &pi); printf("data[0] = %i\n", *(int*)v.data[0]); printf("data[1] = %f\n", *(float*)v.data[1]); vector_delete(&v); }
Вывод:
data[0] = 42 data[1] = 3.141592
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- 7.24.3.4 Функция free_sized (стр: 365-366)
Смотрите также
|
освобождает ранее выделенную память
(функция) |
|
|
(C23)
|
освобождает ранее выделенную выровненную память с указанным размером
(функция) |
|
выделяет память
(функция) |