本文主要是介绍C++标准模板(STL)- C 内存管理库 - 分配内存 (std::malloc),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
C 内存管理库
分配内存
std::malloc
定义于头文件 | ||
void* malloc( std::size_t size ); |
分配 size
字节的未初始化存储。
若分配成功,则返回指向分配的适合对任何标量类型对齐的内存块中,最低(首)字节的指针。
若 size
为零,则行为是实现定义的(可以返回空指针,或某个不可用于访问存储,但必须传递给 std::free 的非空指针)。
要求下列函数是线程安全的:
对这些分配或解分配特定存储单元的函数调用以单独全序出现,并且在此顺序中,每个解分配调用先发生于下个分配(若存在)。 | (C++11 起) |
参数
size | - | 要分配的字节数 |
返回值
成功时,返回指向新分配内存起始的指针。返回的指针必须用 std::free() 或 std::realloc()
解分配。
失败时,返回空指针。
注意
任何情况下,此函数不调用构造函数或初始化内存。无能保证调用匹配的解分配函数的预备使用的智能指针。 C++ 中偏好的内存分配方法是用 RAII 预备函数 std::make_unique 、 std::make_shared 、容器构造函数等,而在低层代码中为 new 表达式。
调用示例
#include <iostream>
#include <cstdlib>
#include <string>class MyString : public std::string
{
public:MyString() : std::string(){std::cout << __FUNCTION__ << std::endl;}MyString(size_type count, char ch): std::string(count, ch){std::cout << __FUNCTION__ << " "<< static_cast<void *>(this) << std::endl;}~MyString(){this->~basic_string();std::cout << __FUNCTION__ << " "<< static_cast<void *>(this) << std::endl;}
};int main()
{// 为 4 个 string 的数组分配足够空间if (auto point = (MyString*)std::malloc(5 * sizeof(MyString))){int i = 0;try{for (; i != 5; ++i) // 填充数组{new (point + i) MyString(5, 'a' + i);}for (int j = 0; j != 5; ++j) // 打印出来{std::cout << "point[" << j << "] == " << point[j] << std::endl;}}catch (...) {}for (; i != 0; --i) // 清理{point[i - 1].~MyString();}std::free(point);}
}
输出
MyString 0x887ac8
MyString 0x887ae0
MyString 0x887af8
MyString 0x887b10
MyString 0x887b28
point[0] == aaaaa
point[1] == bbbbb
point[2] == ccccc
point[3] == ddddd
point[4] == eeeee
~MyString 0x887b28
~MyString 0x887b10
~MyString 0x887af8
~MyString 0x887ae0
~MyString 0x887ac8
这篇关于C++标准模板(STL)- C 内存管理库 - 分配内存 (std::malloc)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!