C++标准库<cstdlib>头文件总结

感谢大家的点赞分享,本专栏进入《C/C++领域内容榜》第4了,笔者将继续分享更多高质量C++、机器人SLAM方向的实战项目知识,欢迎大家订阅专栏或者加入上面知识星球社区交流讨论。
在这里插入图片描述

本文首发行知SLAM·机器人及自动驾驶入行实战社群,点击链接进入该星球可以获取最新独家知识分享:包括计算机基础(ubuntu、vscode、git、vim、grep、bash等工具命令工程使用)、C++语言(CMakeLists、标准库等)、第三方开源库(ROS、PCL、Eigen、Ceres、G2O、OpenCV)及SLAM开源框架(ORB-SLAM3、LOAM等)、数学理论知识、机器人及自动驾驶行业定位(组合导航、IMU、UWB定位)原理、代码及所有PDF资料,以及免费答疑解惑和求职渠道招聘信息分享,并和广大星球小伙伴交流激发更多知识火花,促进大家进步,欢迎大家点击加入了解。

一、<cstdlib> 头文件概述

<cstdlib> 是 C++ 标准库中的一个头文件,它主要包含了 C 标准库 <stdlib.h> 的 C++ 兼容版本,提供了一系列通用的实用函数和宏,用于执行各种基本操作,如内存分配、进程控制、数值转换、随机数生成、环境变量操作等。它包含了一些函数和宏,而不是模板类或模板函数。这些函数和宏提供了对一些基本的系统级操作的支持,帮助开发者在 C++ 程序中完成一些底层操作,虽然不是专门为面向对象编程设计,但在一些需要与系统交互、进行基本数据操作和资源管理的场景中非常有用。

二、<cstdlib> 中的主要函数和宏及其使用场景

  1. 内存分配和释放函数

    • malloc(size_t size)
      • 分配 size 字节的未初始化内存,返回指向该内存的指针。
      • 使用场景:当需要动态分配内存时可以使用,但在 C++ 中更推荐使用 new 或智能指针(来自 <memory> 头文件),因为 malloc 分配的内存需要手动使用 free 释放,容易导致内存泄漏。
    • calloc(size_t num, size_t size)
      • 分配 num 个元素的内存,每个元素大小为 size 字节,并将其初始化为零。
      • 使用场景:当需要分配一块内存并初始化为零的场景,例如创建数组并初始化为零元素。但同样,在 C++ 中,更倾向于使用 new[]std::vector 等容器,因为它们更安全和方便。
    • realloc(void* ptr, size_t size)
      • 调整 ptr 所指向的内存块的大小为 size 字节。
      • 使用场景:当需要动态调整已分配内存的大小时使用,但使用时要非常小心,因为它可能会导致数据移动,而且在 C++ 中使用容器类(如 std::vector)通常是更好的选择,因为它们会自动处理内存调整。
    • free(void* ptr)
      • 释放之前通过 malloccallocrealloc 分配的内存。
      • 使用场景:与 malloc 等分配函数配套使用,但使用 new 或智能指针时不需要手动调用此函数。
  2. 进程控制和环境操作函数

    • system(const char* command)
      • 执行操作系统命令 command
      • 使用场景:在需要执行系统命令,如启动外部程序或执行脚本时使用,但要注意安全性和可移植性问题,因为不同操作系统的命令可能不同。
    • exit(int status)
      • 终止程序,并返回 status 作为退出状态。
      • 使用场景:当程序需要提前终止并返回一个状态码时使用,但在 C++ 中,尽量使用异常或正常的程序流控制,因为 exit 会绕过正常的对象析构,可能导致资源泄漏。
  3. 数值转换函数

    • atoi(const char* str)atol(const char* str)atof(const char* str)
      • 将字符串 str 转换为 intlongfloat 等数值类型。
      • 使用场景:当需要将字符串表示的数字转换为相应的数值类型时使用,但 C++ 提供了更安全的 std::stoistd::stolstd::stof 等函数,它们提供更好的错误处理。
  4. 随机数生成函数

    • rand()
      • 生成一个伪随机数。
      • 使用场景:生成简单的随机数,不过它的随机性和范围有限,通常需要结合 srand() 使用。
    • srand(unsigned int seed)
      • rand() 函数设置随机数种子。
      • 使用场景:在使用 rand() 之前,需要设置一个种子,以改变随机数序列。但 C++ 提供了更强大的随机数库 <random>,通常更推荐使用。
  5. 其他函数和宏

    • abort()
      • 异常终止程序,不执行正常的终止处理。
      • 使用场景:当程序发生严重错误需要立即终止时使用,但尽量避免使用,因为它会导致资源未释放。
    • NULL
      • 表示空指针。
      • 使用场景:在 C++ 中,更推荐使用 nullptr,因为它具有更好的类型安全性。

三、函数和类的详细用法及代码实例

  1. 使用 mallocfree
#include <cstdlib>
#include <iostream>

int main() {
    int* arr = (int*)std::malloc(5 * sizeof(int));
    if (arr) {
        for (int i = 0; i < 5; ++i) {
            arr[i] = i;
            std::cout << arr[i] << " ";
        }
        std::free(arr);
    }
    return 0;
}
  • 代码解释
    • std::malloc(5 * sizeof(int)) 分配存储 5 个 int 的内存。
    • (int*) 进行类型转换,将 void* 转换为 int*
    • std::free(arr) 释放分配的内存。
  1. 使用 system
#include <cstdlib>
#include <iostream>

int main() {
    std::system("ls -l");  // 在 Unix/Linux 系统中列出文件
    return 0;
}
  • 代码解释
    • std::system("ls -l") 执行 ls -l 命令,输出文件列表。
  1. 使用 atoiatof
#include <cstdlib>
#include <iostream>

int main() {
    const char* str_num = "42";
    int num = std::atoi(str_num);
    std::cout << "Integer: " << num << std::endl;

    const char* str_float = "3.14";
    float f = std::atof(str_float);
    std::cout << "Float: " << f << std::endl;
    return 0;
}
  • 代码解释
    • std::atoi(str_num) 将字符串转换为整数。
    • std::atof(str_float) 将字符串转换为浮点数。
  1. 使用 randsrand
#include <cstdlib>
#include <iostream>
#include <ctime>

int main() {
    std::srand(std::time(nullptr));  // 使用当前时间作为种子
    for (int i = 0; i < 5; ++i) {
        std::cout << std::rand() << " ";
    }
    return 0;
}
  • 代码解释
    • std::srand(std::time(nullptr)) 设置随机数种子。
    • std::rand() 生成随机数。

四、在机器人 SLAM 中的应用实例

以下是一个简单的机器人 SLAM 示例,展示了 <cstdlib> 的一些可能应用:

#include <cstdlib>
#include <iostream>
#include <vector>
#include <string>
#include <memory>

class SLAMSystem {
private:
    std::vector<int> mapData;

    void loadMapFromFile(const std::string& filename) {
        // 假设使用 system 调用外部工具加载地图文件
        std::string command = "load_map_tool " + filename;
        std::system(command.c_str());

        // 假设使用 atoi 解析配置文件中的参数
        const char* num_str = "100";  // 从配置文件读取的字符串
        int map_size = std::atoi(num_str);
        mapData.resize(map_size);
    }

public:
    SLAMSystem(const std::string& filename) {
        loadMapFromFile(filename);
    }
};

int main() {
    SLAMSystem slam("map.txt");
    return 0;
}
  • 代码解释
    • SLAMSystem 类的 loadMapFromFile 方法:
      • std::system(command.c_str()) 可能用于调用外部工具加载地图文件,但这种方式不推荐,因为不够安全和可移植。
      • std::atoi(num_str) 用于将配置文件中的字符串参数转换为整数,以设置地图大小,但 std::stoi 会是更好的选择。

在机器人 SLAM 中,<cstdlib> 的使用频率相对较低,因为 C++ 提供了更安全和高级的替代方案:

  • 不推荐的使用
    • malloccallocreallocfree 通常被 newnew[] 和智能指针取代,因为它们更安全和方便,不易导致内存泄漏。
    • randsrand 通常被 <random> 库中的随机数生成器取代,以获得更好的随机性和控制。
    • atoiatolatof 通常被 std::stoistd::stolstd::stof 取代,因为后者提供更好的错误处理。

然而,在某些情况下,可能会使用到 <cstdlib> 中的一些函数:

  • 可能的使用
    • system 可能在需要调用外部工具或执行系统命令时使用,但要谨慎考虑可移植性和安全性。
    • exit 可能在程序遇到严重错误需要立即终止时使用,但应尽量避免,因为它可能导致资源未释放。

总之,虽然 <cstdlib> 提供了一些基本的系统级操作,但在 C++ 编程中,尤其是在机器人 SLAM 这样的复杂项目中,应尽量使用更现代、更安全的 C++ 标准库功能,仅在必要时使用 <cstdlib> 中的函数,并注意其局限性和潜在的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行知SLAM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值