Difference between revisions of "cpp/memory/c/malloc"
(note that the non-null pointer result of malloc(0) needs to go to free (as valgrind reminds me)) |
Andreas Krug (Talk | contribs) m ({{c}}, ., fmt, ., headers sorted) |
||
(14 intermediate revisions by 8 users not shown) | |||
Line 1: | Line 1: | ||
{{cpp/title|malloc}} | {{cpp/title|malloc}} | ||
{{cpp/memory/c/navbar}} | {{cpp/memory/c/navbar}} | ||
− | {{ddcl | header=cstdlib | | + | {{ddcl|header=cstdlib| |
void* malloc( std::size_t size ); | void* malloc( std::size_t size ); | ||
}} | }} | ||
− | Allocates {{ | + | Allocates {{c|size}} bytes of uninitialized storage. |
− | If allocation succeeds, returns a pointer to the lowest (first) byte in the allocated memory block that is suitably aligned for any scalar type. | + | If allocation succeeds, returns a pointer to the lowest (first) byte in the allocated memory block that is suitably aligned for any scalar type (at least as strictly as {{lc|std::max_align_t}}) ([[cpp/language/object#Object creation|implicitly creating]] objects in the destination area). |
− | If {{ | + | If {{c|size}} is zero, the behavior is implementation defined (null pointer may be returned, or some non-null pointer may be returned that may not be used to access storage, but has to be passed to {{lc|std::free}}). |
{{cpp/memory/thread_safety_note}} | {{cpp/memory/thread_safety_note}} | ||
Line 15: | Line 15: | ||
===Parameters=== | ===Parameters=== | ||
{{par begin}} | {{par begin}} | ||
− | {{par | size | number of bytes to allocate }} | + | {{par|size|number of bytes to allocate}} |
{{par end}} | {{par end}} | ||
===Return value=== | ===Return value=== | ||
− | On success, returns the pointer to the beginning of newly allocated memory. | + | On success, returns the pointer to the beginning of newly allocated memory. To avoid a memory leak, the returned pointer must be deallocated with {{lc|std::free()}} or {{lc|std::realloc()}}. |
On failure, returns a null pointer. | On failure, returns a null pointer. | ||
Line 25: | Line 25: | ||
===Notes=== | ===Notes=== | ||
This function does not call constructors or initialize memory in any way. There are no ready-to-use smart pointers that could guarantee that the matching deallocation function is called. The preferred method of memory allocation in C++ is using RAII-ready functions {{lc|std::make_unique}}, {{lc|std::make_shared}}, container constructors, etc, and, in low-level library code, [[cpp/language/new|new-expression]]. | This function does not call constructors or initialize memory in any way. There are no ready-to-use smart pointers that could guarantee that the matching deallocation function is called. The preferred method of memory allocation in C++ is using RAII-ready functions {{lc|std::make_unique}}, {{lc|std::make_shared}}, container constructors, etc, and, in low-level library code, [[cpp/language/new|new-expression]]. | ||
+ | |||
+ | For loading a large file, file mapping via OS-specific functions, e.g. [https://pubs.opengroup.org/onlinepubs/9699919799/functions/mmap.html {{tt|mmap}}] on POSIX or {{tt|CreateFileMapping}}([https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createfilemappinga {{tt|A}}]/[https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-createfilemappingw {{tt|W}}]) along with [https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-mapviewoffile {{tt|MapViewOfFile}}] on Windows, is preferable to allocating a buffer for file reading. | ||
===Example=== | ===Example=== | ||
{{example | {{example | ||
− | + | |code= | |
+ | #include <cstdlib> | ||
#include <iostream> | #include <iostream> | ||
− | #include < | + | #include <memory> |
+ | #include <string> | ||
int main() | int main() | ||
{ | { | ||
− | + | constexpr std::size_t size = 4; | |
− | + | if (auto ptr = reinterpret_cast<std::string*>(std::malloc(size * sizeof(std::string)))) | |
− | + | { | |
− | + | try | |
− | + | { | |
− | for( | + | for (std::size_t i = 0; i < size; ++i) |
− | + | std::construct_at(ptr + i, 5, 'a' + i); | |
− | + | for (std::size_t i = 0; i < size; ++i) | |
− | + | std::cout << "ptr[" << i << "] == " << ptr[i] << '\n'; | |
+ | std::destroy_n(ptr, size); | ||
+ | } | ||
+ | catch (...) {} | ||
+ | std::free(ptr); | ||
} | } | ||
− | |||
− | |||
− | |||
− | |||
} | } | ||
− | + | |output= | |
− | + | p[0] == aaaaa | |
− | + | p[1] == bbbbb | |
− | + | p[2] == ccccc | |
− | + | p[3] == ddddd | |
}} | }} | ||
− | |||
===See also=== | ===See also=== | ||
{{dsc begin}} | {{dsc begin}} | ||
− | {{dsc inc | cpp/memory/new/dsc operator_new}} | + | {{dsc inc|cpp/memory/new/dsc operator_new}} |
− | {{dsc inc | cpp/memory/dsc get_temporary_buffer}} | + | {{dsc inc|cpp/memory/dsc get_temporary_buffer}} |
− | {{dsc see c | c/memory/malloc}} | + | {{dsc see c|c/memory/malloc}} |
{{dsc end}} | {{dsc end}} | ||
− | + | {{langlinks|de|es|fr|it|ja|pl|pt|ru|zh}} | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + |
Latest revision as of 11:23, 12 June 2023
Defined in header <cstdlib>
|
||
void* malloc( std::size_t size ); |
||
Allocates size bytes of uninitialized storage.
If allocation succeeds, returns a pointer to the lowest (first) byte in the allocated memory block that is suitably aligned for any scalar type (at least as strictly as std::max_align_t) (implicitly creating objects in the destination area).
If size is zero, the behavior is implementation defined (null pointer may be returned, or some non-null pointer may be returned that may not be used to access storage, but has to be passed to std::free).
The following functions are required to be thread-safe:
Calls to these functions that allocate or deallocate a particular unit of storage occur in a single total order, and each such deallocation call happens-before the next allocation (if any) in this order. |
(since C++11) |
Contents |
[edit] Parameters
size | - | number of bytes to allocate |
[edit] Return value
On success, returns the pointer to the beginning of newly allocated memory. To avoid a memory leak, the returned pointer must be deallocated with std::free() or std::realloc().
On failure, returns a null pointer.
[edit] Notes
This function does not call constructors or initialize memory in any way. There are no ready-to-use smart pointers that could guarantee that the matching deallocation function is called. The preferred method of memory allocation in C++ is using RAII-ready functions std::make_unique, std::make_shared, container constructors, etc, and, in low-level library code, new-expression.
For loading a large file, file mapping via OS-specific functions, e.g. mmap
on POSIX or CreateFileMapping
(A
/W
) along with MapViewOfFile
on Windows, is preferable to allocating a buffer for file reading.
[edit] Example
#include <cstdlib> #include <iostream> #include <memory> #include <string> int main() { constexpr std::size_t size = 4; if (auto ptr = reinterpret_cast<std::string*>(std::malloc(size * sizeof(std::string)))) { try { for (std::size_t i = 0; i < size; ++i) std::construct_at(ptr + i, 5, 'a' + i); for (std::size_t i = 0; i < size; ++i) std::cout << "ptr[" << i << "] == " << ptr[i] << '\n'; std::destroy_n(ptr, size); } catch (...) {} std::free(ptr); } }
Output:
p[0] == aaaaa p[1] == bbbbb p[2] == ccccc p[3] == ddddd
[edit] See also
allocation functions (function) | |
(deprecated in C++17)(removed in C++20) |
obtains uninitialized storage (function template) |
C documentation for malloc
|