xref: /minix/lib/libc/stdlib/malloc.3 (revision 0a6a1f1d)
1.\" $NetBSD: malloc.3,v 1.44 2015/07/26 22:32:03 wiz Exp $
2.\"
3.\" Copyright (c) 1980, 1991, 1993
4.\"	The Regents of the University of California.  All rights reserved.
5.\"
6.\" This code is derived from software contributed to Berkeley by
7.\" the American National Standards Committee X3, on Information
8.\" Processing Systems.
9.\"
10.\" Redistribution and use in source and binary forms, with or without
11.\" modification, are permitted provided that the following conditions
12.\" are met:
13.\" 1. Redistributions of source code must retain the above copyright
14.\"    notice, this list of conditions and the following disclaimer.
15.\" 2. Redistributions in binary form must reproduce the above copyright
16.\"    notice, this list of conditions and the following disclaimer in the
17.\"    documentation and/or other materials provided with the distribution.
18.\" 3. Neither the name of the University nor the names of its contributors
19.\"    may be used to endorse or promote products derived from this software
20.\"    without specific prior written permission.
21.\"
22.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32.\" SUCH DAMAGE.
33.\"
34.\"     @(#)malloc.3	8.1 (Berkeley) 6/4/93
35.\" $FreeBSD: src/lib/libc/stdlib/malloc.3,v 1.73 2007/06/15 22:32:33 jasone Exp $
36.\"
37.Dd July 26, 2015
38.Dt MALLOC 3
39.Os
40.Sh NAME
41.Nm malloc , calloc , realloc , free
42.Nd general purpose memory allocation functions
43.Sh LIBRARY
44.Lb libc
45.Sh SYNOPSIS
46.In stdlib.h
47.Ft void *
48.Fn malloc "size_t size"
49.Ft void *
50.Fn calloc "size_t number" "size_t size"
51.Ft void *
52.Fn realloc "void *ptr" "size_t size"
53.Ft void
54.Fn free "void *ptr"
55.Sh DESCRIPTION
56The
57.Fn malloc
58function allocates
59.Fa size
60bytes of uninitialized memory.
61The allocated space is suitably aligned (after possible pointer coercion)
62for storage of any type of object.
63.Pp
64The
65.Fn calloc
66function allocates space for
67.Fa number
68objects,
69each
70.Fa size
71bytes in length.
72The result is identical to calling
73.Fn malloc
74with an argument of
75.Dq "number * size" ,
76with the exception that the allocated memory is explicitly initialized
77to zero bytes.
78.Pp
79The
80.Fn realloc
81function changes the size of the previously allocated memory referenced by
82.Fa ptr
83to
84.Fa size
85bytes.
86The contents of the memory are unchanged up to the lesser of the new and
87old sizes.
88If the new size is larger,
89the value of the newly allocated portion of the memory is undefined.
90Upon success, the memory referenced by
91.Fa ptr
92is freed and a pointer to the newly allocated memory is returned.
93.Pp
94Note that
95.Fn realloc
96may move the memory allocation, resulting in a different return value than
97.Fa ptr .
98If
99.Fa ptr
100is
101.Dv NULL ,
102the
103.Fn realloc
104function behaves identically to
105.Fn malloc
106for the specified size.
107.Pp
108The
109.Fn free
110function causes the allocated memory referenced by
111.Fa ptr
112to be made available for future allocations.
113If
114.Fa ptr
115is
116.Dv NULL ,
117no action occurs.
118.Sh RETURN VALUES
119The
120.Fn malloc
121and
122.Fn calloc
123functions return a pointer to the allocated memory if successful; otherwise
124a
125.Dv NULL
126pointer is returned and
127.Va errno
128is set to
129.Er ENOMEM .
130.Pp
131The
132.Fn realloc
133function returns a pointer, possibly identical to
134.Fa ptr ,
135to the allocated memory
136if successful; otherwise a
137.Dv NULL
138pointer is returned, and
139.Va errno
140is set to
141.Er ENOMEM
142if the error was the result of an allocation failure.
143The
144.Fn realloc
145function always leaves the original buffer intact
146when an error occurs.
147.Pp
148The
149.Fn free
150function returns no value.
151.Sh EXAMPLES
152When using
153.Fn malloc ,
154be careful to avoid the following idiom:
155.Bd -literal -offset indent
156if ((p = malloc(number * size)) == NULL)
157	err(EXIT_FAILURE, "malloc");
158.Ed
159.Pp
160The multiplication may lead to an integer overflow.
161To avoid this,
162.Xr reallocarr 3
163is recommended.
164.Pp
165If
166.Fn malloc
167must be used, be sure to test for overflow:
168.Bd -literal -offset indent
169if (size && number > SIZE_MAX / size) {
170	errno = EOVERFLOW;
171	err(EXIT_FAILURE, "allocation");
172}
173.Ed
174.Pp
175The above test is not sufficient in all cases.
176For example, multiplying ints requires a different set of checks:
177.Bd -literal -offset indent
178int num, size;
179\&.\&.\&.
180
181/* Avoid invalid requests */
182if (size < 0 || num < 0)
183	errc(1, EOVERFLOW, "overflow");
184
185/* Check for signed int overflow */
186if (size && num > INT_MAX / size)
187	errc(1, EOVERFLOW, "overflow");
188
189if ((p = malloc(size * num)) == NULL)
190	err(1, "malloc");
191.Ed
192.Pp
193Assuming the implementation checks for integer overflow as
194.Nx
195does, it is much easier to use
196.Fn calloc
197or
198.Xr reallocarr 3 .
199.Pp
200The above examples could be simplified to:
201.Bd -literal -offset indent
202ptr = NULL;
203if ((e = reallocarr(&ptr, num, size)))
204	errx(1, "reallocarr", strerror(e));
205.Ed
206.Bd -literal -offset indent
207or at the cost of initialization:
208if ((p = calloc(num, size)) == NULL)
209	err(1, "calloc");
210.Ed
211.Pp
212When using
213.Fn realloc ,
214one must be careful to avoid the following idiom:
215.Bd -literal -offset indent
216nsize += 50;
217
218if ((p = realloc(p, nsize)) == NULL)
219	return NULL;
220.Ed
221.Pp
222Do not adjust the variable describing how much memory has been allocated
223until it is known that the allocation has been successful.
224This can cause aberrant program behavior if the incorrect size value is used.
225In most cases, the above example will also leak memory.
226As stated earlier, a return value of
227.Dv NULL
228indicates that the old object still remains allocated.
229Better code looks like this:
230.Bd -literal -offset indent
231newsize = size + 50;
232
233if ((p2 = realloc(p, newsize)) == NULL) {
234
235	if (p != NULL)
236		free(p);
237
238	p = NULL;
239	return NULL;
240}
241
242p = p2;
243size = newsize;
244.Ed
245.Sh SEE ALSO
246.\" .Xr limits 1 ,
247.Xr madvise 2 ,
248.Xr mmap 2 ,
249.Xr sbrk 2 ,
250.Xr alloca 3 ,
251.Xr atexit 3 ,
252.Xr getpagesize 3 ,
253.Xr memory 3 ,
254.Xr posix_memalign 3 ,
255.Xr reallocarr 3
256.Pp
257For the implementation details, see
258.Xr jemalloc 3 .
259.Sh STANDARDS
260The
261.Fn malloc ,
262.Fn calloc ,
263.Fn realloc
264and
265.Fn free
266functions conform to
267.St -isoC .
268.Sh HISTORY
269A
270.Fn free
271internal kernel function and a predecessor to
272.Fn malloc ,
273.Fn alloc ,
274first appeared in
275.At v1 .
276The C Library functions
277.Fn alloc
278and
279.Fn free
280appeared in
281.At v6 .
282The functions
283.Fn malloc ,
284.Fn calloc ,
285and
286.Fn realloc
287first appeared in
288.At v7 .
289.Pp
290A new implementation by Chris Kingsley was introduced in
291.Bx 4.2 ,
292followed by a complete rewrite by Poul-Henning Kamp
293.Dq ( phk's malloc
294or
295.Dq new malloc )
296which appeared in
297.Fx 2.2
298and was included in
299.Nx 1.5
300and
301.Ox 2.0 .
302These implementations were all
303.Xr sbrk 2
304based.
305.Pp
306The
307.Xr jemalloc 3
308allocator became the default system allocator first in
309.Fx 7.0
310and then in
311.Nx 5.0 .
312