Namespaces
Variants

std:: malloc

From cppreference.net
< cpp ‎ | memory ‎ | c
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
定义于头文件 <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