std:: malloc
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
定义于头文件
<cstdlib>
|
||
|
void
*
malloc
(
std::
size_t
size
)
;
|
||
分配 size 字节的未初始化存储空间。
如果分配成功,返回指向已分配内存块中最低(首个)字节的指针,该内存块已按适合任何标量类型的对齐要求进行对齐(至少严格如 std::max_align_t )(在目标区域 隐式创建 对象)。
如果 size 为零,其行为由实现定义(可能返回空指针,也可能返回某个非空指针——该指针不可用于访问存储空间,但必须传递给 std::free )。
|
以下函数要求是线程安全的:
对这些函数分配或释放特定存储单元的调用以单一全序方式执行,且每个这样的释放调用 先发生于 该顺序中的下一个分配调用(如果存在)。 |
(since C++11) |
目录 |
参数
| size | - | 要分配的字节数 |
返回值
成功时,返回指向新分配内存起始位置的指针。为避免内存泄漏,必须使用 std::free() 或 std::realloc() 释放返回的指针。
失败时,返回空指针。
注释
此函数不会以任何方式调用构造函数或初始化内存。目前没有现成的智能指针能够保证调用匹配的释放函数。C++中首选的动态内存分配方式是使用支持RAII的函数 std::make_unique 、 std::make_shared 、容器构造函数等,而在底层库代码中则使用 new表达式 。
对于加载大型文件,通过操作系统特定函数进行文件映射,例如在POSIX系统上使用
mmap
或在Windows系统上使用
CreateFileMapping
(
A
/
W
)配合
MapViewOfFile
,比分配缓冲区进行文件读取更为可取。
示例
#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); } }
输出:
p[0] == aaaaa p[1] == bbbbb p[2] == ccccc p[3] == ddddd
参阅
|
分配函数
(函数) |
|
|
(deprecated in C++17)
(removed in C++20)
|
获取未初始化存储
(函数模板) |
|
C 文档
关于
malloc
|
|