.\" -*- coding: UTF-8 -*- .\" Copyright (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de) .\" and Copyright i2007, 2012, 2018, Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" Modified Sat Jul 24 19:00:59 1993 by Rik Faith (faith@cs.unc.edu) .\" Clarification concerning realloc, iwj10@cus.cam.ac.uk (Ian Jackson), 950701 .\" Documented MALLOC_CHECK_, Wolfram Gloger (wmglo@dent.med.uni-muenchen.de) .\" 2007-09-15 mtk: added notes on malloc()'s use of sbrk() and mmap(). .\" .\" FIXME . Review http://austingroupbugs.net/view.php?id=374 .\" to see what changes are required on this page. .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH MALLOC 3 "9 июня 2020 г." GNU "Руководство программиста Linux" .SH ИМЯ malloc, free, calloc, realloc, reallocarray \- allocate and free dynamic memory .SH СИНТАКСИС .nf \fB#include \fP .PP \fBvoid *malloc(size_t \fP\fIsize\fP\fB);\fP \fBvoid free(void \fP\fI*ptr\fP\fB);\fP \fBvoid *calloc(size_t \fP\fInmemb\fP\fB, size_t \fP\fIsize\fP\fB);\fP \fBvoid *realloc(void \fP\fI*ptr\fP\fB, size_t \fP\fIsize\fP\fB);\fP \fBvoid *reallocarray(void \fP\fI*ptr\fP\fB, size_t \fP\fInmemb\fP\fB, size_t \fP\fIsize\fP\fB);\fP .fi .PP .RS -4 Требования макроса тестирования свойств для glibc (см. \fBfeature_test_macros\fP(7)): .RE .PP \fBreallocarray\fP(): .ad l Since glibc 2.29: _DEFAULT_SOURCE Glibc 2.28 and earlier: _GNU_SOURCE .ad .SH ОПИСАНИЕ .\" glibc does this: Функция \fBmalloc\fP() распределяет \fIsize\fP байтов и возвращает указатель на распределённую память. \fIПамять при этом не инициализируется\fP. Если значение \fIsize\fP равно 0, то \fBmalloc\fP() возвращает или NULL, или уникальный указатель, который можно без опасений передавать \fBfree\fP(). .PP Функция \fBfree\fP() освобождает место в памяти, указанное в \fIptr\fP, которое должно быть получено ранее вызовом функции \fBmalloc\fP(), \fBcalloc\fP() или \fBrealloc\fP(). Иначе (или если вызов \fIfree(ptr)\fP уже выполнялся) дальнейшее поведение не определено. Если значение \fIptr\fP равно NULL, то не выполняется никаких действий. .PP .\" glibc does this: Функция \fBсalloc\fP() распределяет память для массива размером \fInmemb\fP элементов по \fIsize\fP байтов каждый и возвращает указатель на распределённую память. Данные в выделенной памяти при этом обнуляются. Если значение \fInmemb\fP или \fIsize\fP равно 0, то \fBcalloc\fP() возвращает NULL или уникальный указатель, который можно без опасений передавать \fBfree\fP(). Если перемножение \fInmemb\fP и \fIsize\fP приводит к целочисленному переполнению, то \fBcalloc\fP() возвращает ошибку. Это отличает её от \fBmalloc\fP(), которая не обнаруживает целочисленное переполнение и возвращает блок памяти неправильного размера: .PP .in +4n .EX malloc(nmemb * size); .EE .in .PP Функция \fBrealloc\fP() меняет размер блока памяти, на который указывает \fIptr\fP, на размер, равный \fIsize\fP байт. Содержимое памяти не будет изменено от начала области в пределах наименьшего из старого и нового размеров. Если новый размер больше старого, то добавленная память \fIне\fP будет инициализирована. Если значение \fIptr\fP равно NULL, то вызов эквивалентен \fImalloc(size)\fP для всех значений \fIsize\fP; если значение \fIsize\fP равно нулю и \fIptr\fP не равно NULL, то вызов эквивалентен \fIfree(ptr)\fP. Если только значение \fIptr\fP не равно NULL, то должно быть возвращено ранее полученное значение от \fBmalloc\fP(), \fBcalloc\fP() или \fBrealloc\fP(). Если область была перемещена, то выполняется \fIfree(ptr)\fP. .PP Функция \fBreallocarray\fP() изменяет размер блока памяти, на который указывает \fIptr\fP, таким образом, чтобы он смог вместить массив из \fInmemb\fP элементов, каждый из которых занимает \fIsize\fP байт. Она эквивалентна вызову .PP .in +4n realloc(ptr, nmemb * size); .in .PP Однако в отличие от вызова \fBrealloc\fP(), функция \fBreallocarray\fP() безопасно завершается ошибкой в случае возникновения переполнения умножения. Если это происходит, то \fBreallocarray\fP() возвращает NULL, присваивает \fIerrno\fP значение \fBENOMEM\fP и оставляет первоначальный блок памяти в неизменном виде. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" Функции \fBmalloc\fP() и \fBcalloc\fP() возвращают указатель на распределённую память, выровненную должным образом для любого встроенного типа. При ошибке возвращается NULL. Значение NULL также может быть получено при успешной работе вызова \fBmalloc\fP(), если значение \fIsize\fP равно нулю, или \fBcalloc\fP() — если значение \fInmemb\fP или \fIsize\fP равно нулю. .PP Функция \fBfree\fP() ничего не возвращает. .PP The \fBrealloc\fP() function returns a pointer to the newly allocated memory, which is suitably aligned for any built\-in type, or NULL if the request failed. The returned pointer may be the same as \fIptr\fP if the allocation was not moved (e.g., there was room to expand the allocation in\-place), or different from \fIptr\fP if the allocation was moved to a new address. If \fIsize\fP was equal to 0, either NULL or a pointer suitable to be passed to \fBfree\fP() is returned. If \fBrealloc\fP() fails, the original block is left untouched; it is not freed or moved. .PP При успешном выполнении функция \fBreallocarray\fP() возвращает указатель на новую выделенную память. При ошибке возвращается NULL, а первоначальный блок памяти не изменяется. .SH ОШИБКИ Функции \fBcalloc\fP(), \fBmalloc\fP(), \fBrealloc\fP() и \fBreallocarray\fP() могут завершаться со следующей ошибкой: .TP \fBENOMEM\fP Не хватает памяти. Вероятно приложение достигнут лимит \fBRLIMIT_AS\fP или \fBRLIMIT_DATA\fP, описанный в \fBgetrlimit\fP(2). .SH ВЕРСИИ \fBreallocarray\fP() first appeared in glibc in version 2.26. .SH АТРИБУТЫ Описание терминов данного раздела смотрите в \fBattributes\fP(7). .TS allbox; lbw20 lb lb l l l. Интерфейс Атрибут Значение T{ \fBmalloc\fP(), \fBfree\fP(), .br \fBcalloc\fP(), \fBrealloc\fP() T} Безвредность в нитях MT\-Safe .TE .SH "СООТВЕТСТВИЕ СТАНДАРТАМ" \fBmalloc\fP(), \fBfree\fP(), \fBcalloc\fP(), \fBrealloc\fP(): POSIX.1\-2001, POSIX.1\-2008, C89, C99. .PP Функция \fBreallocarray\fP() является нестандартным расширением, впервые появилась в OpenBSD 5.6 и FreeBSD 11.0. .SH ЗАМЕЧАНИЯ По умолчанию, Linux придерживается оптимистичной стратегии распределения памяти. Это означает, что когда \fBmalloc\fP() возвращает значение не NULL, то нет никаких гарантий, что память в действительности доступна. Если обнаружится, что системе не хватает памяти, то один или несколько процессов будут завершены OOM. Дополнительную информацию можно получить из описания \fI/proc/sys/vm/overcommit_memory\fP и \fI/proc/sys/vm/oom_adj\fP в \fBproc\fP(5) и файле из исходного кода ядра Linux \fIDocumentation/vm/overcommit\-accounting.rst\fP. .PP Обычно, \fBmalloc\fP() выделяет память из кучи и подгоняет размер кучи соответствующим образом с помощью \fBsbrk\fP(2). Если выделяемый блок памяти больше чем \fBMMAP_THRESHOLD\fP байт, то реализация \fBmalloc\fP() в glibc выделяет память с помощью \fBmmap\fP(2) в виде частного анонимного отображения. По умолчанию, значение \fBMMAP_THRESHOLD\fP равно 128\ КБ, но его можно изменить с помощью \fBmallopt\fP(3). До Linux 4.7 на выделения, выполняемые с помощью \fBmmap\fP(2), не влияет ограничитель ресурса \fBRLIMIT_DATA\fP; начиная с Linux 4.7 это ограничение также применяется к выделениям, созданным с помощью \fBmmap\fP(2). .PP Внутри данных функций для защиты от повреждений выделяемых структур данных управления памятью, используются мьютексы. В многонитевых приложениях, в которых нити одновременно выделяют и освобождают память, может возникнуть конфликт за обладание этими мьютексами. Чтобы расширить обработку выделения памяти в многонитевых приложениях библиотека glibc создаёт дополнительные \fIобласти выделения памяти\fP (memory allocation arenas), если обнаруживается конфликт. Каждая область представляет собой большой кусок памяти, который внутренне выделен системой (с помощью \fBbrk\fP(2) или \fBmmap\fP(2)) и управляется своими собственными мьютексами. .PP Стандарт SUSv2 требует, чтобы функции \fBmalloc\fP(), \fBcalloc\fP() и \fBrealloc\fP() при ошибках присваивали значение \fBENOMEM\fP переменной \fIerrno\fP. Glibc допускает, что это уже реализовано (и версии glibc этих функций делают это); если вы используете свою реализацию функции malloc, которая не изменяет \fIerrno\fP, то некоторые функции библиотеки могут закончить работу с ошибкой без указания причины в \fIerrno\fP. .PP Аварийные ситуации в \fBmalloc\fP(), \fBcalloc\fP(), \fBrealloc\fP() или \fBfree\fP() почти всегда связаны с повреждением кучи, например, с переполнением больших распределённых участков памяти или освобождением одного и того же указателя дважды. .PP Реализация \fBmalloc\fP() настраивается с помощью переменных окружения; подробности смотрите в \fBmallopt\fP(3). .SH "СМ. ТАКЖЕ" .\" http://g.oswego.edu/dl/html/malloc.html .\" A Memory Allocator - by Doug Lea .\" .\" http://www.bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html .\" Linux Heap, Contention in free() - David Boreham .\" .\" http://www.citi.umich.edu/projects/linux-scalability/reports/malloc.html .\" malloc() Performance in a Multithreaded Linux Environment - .\" Check Lever, David Boreham .\" .ad l .nh \fBvalgrind\fP(1), \fBbrk\fP(2), \fBmmap\fP(2), \fBalloca\fP(3), \fBmalloc_get_state\fP(3), \fBmalloc_info\fP(3), \fBmalloc_trim\fP(3), \fBmalloc_usable_size\fP(3), \fBmallopt\fP(3), \fBmcheck\fP(3), \fBmtrace\fP(3), \fBposix_memalign\fP(3) .PP Информацию о реализации в библиотеке GNU C смотрите в .UR https://sourceware.org/glibc/wiki/MallocInternals .UE . .SH ЗАМЕЧАНИЯ Эта страница является частью проекта Linux \fIman\-pages\fP версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу \%https://www.kernel.org/doc/man\-pages/. .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан aereiae , Alexey , Azamat Hackimov , Dmitriy S. Seregin , Dmitry Bolkhovskikh , ITriskTI , Max Is , Yuri Kozlov , Иван Павлов и Малянов Евгений Викторович . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .