【问题标题】:Unexpected size when using malloc()使用 malloc() 时出现意外大小
【发布时间】:2020-05-25 17:44:59
【问题描述】:

我想测试一下自己的知识,写了一个小程序,如下所示:

#include <iostream>
#include <cstdlib>

int main()
{
    int* mem1 = (int*) malloc(2 * sizeof(int));
    int* mem2 = (int*) malloc(5 * sizeof(int));

    std::cout << "mem1: " << sizeof(mem1) << std::endl;
    std::cout << "mem2: " << sizeof(mem2) << std::endl;

    return 0;
}

我得到了输出:

mem1: 8
mem2: 8

当我将 malloc(2 * sizeof(int)) 更改为 malloc(3 * sizeof(int)) 的值时,输出也不会改变。

This 是我使用的教程,所以我不完全确定,如果这是内存安全的,在调用malloc 时转换为int*。 我还发现了this 问题,但我认为它对我的情况没有多大帮助。 Clang++ 是我使用的编译器,但我认为它没有任何区别。

我最好的猜测是,它分配了相同的内存,因为它不知道内存在哪里结束。

【问题讨论】:

  • 你不应该像这样在 C++ 中使用malloc。目前从技术上讲,在不干预placement-new 的情况下使用malloced 内存始终是未定义的行为,并且在实践中对于非平凡的类型肯定会中断。您应该使用new,甚至最好根本不使用手动动态内存管理。你应该改用std::vector
  • 链接教程站点提到的所有库函数,除了&lt;iostream&gt;,都是继承到C++中的C库函数。该站点实际上并未教授 C++ 标准库。我建议你不要用它来学习 C++。
  • sizeof 不会做你认为的那样。你想要std::size 吗?另外,为什么你在 C++ 程序中使用mallocint* mem1 = (int*) malloc(2 * sizeof(int)); 在一个理智的 C++ 程序中你永远不会这样做。 C 风格的演员表应该就可以了,但即使这样,其余的都是错误的。查找std::vector

标签: c++ malloc clang clang++


【解决方案1】:

sizeof 告诉您指针 的编译时大小(即使您根本没有调用malloc,它也会报告相同的值)。没有符合标准的方法来确定malloc 分配的内存量;如果您需要保留该信息,则必须将其存储在边带上。

【讨论】:

    【解决方案2】:

    您看到的8 字节是指针的大小(int*)。 sizeof() 是在编译时完成的,编译器无法在编译时知道这个大小(malloc 是动态内存分配)。

    【讨论】:

      【解决方案3】:

      表达式sizeof(mem1)总是返回相同的值,无论分配的内存块大小如何!这是因为mem1 是一个指向已分配内存的指针,并且指针的大小不会改变(即在给定的环境中)。

      在您的情况下(大概是在 64 位平台上构建)指针的长度为 8 个字节。您可以为不同的平台(例如,32 位系统)构建它,并且您可能获得不同的大小(例如,4);但是,在那个平台上,那个大小将总是为4。

      【讨论】:

        【解决方案4】:

        如上所述,这个问题有几个问题:

        1. 在 C++ 中,您使用 new 运算符动态分配内存。使用 malloc 的选项用于使用 c 风格的 API,当需要动态分配时,将由 c-free 函数解除分配。为了进行这样的分配,最好使用 std::malloc ,您可以在 this link (cpp reference) 中阅读。
        2. 运算符 sizeof 正在计算 静态类型的大小,这意味着它会返回整数指针的大小,该大小是恒定的,具体取决于您的 CPU 架构。
        3. 在 C++ 中使用原始指针是不明智的,您应该始终确保对于在内存中动态创建的每个项目都有一个 所有者,该所有者负责在不再使用时将其删除需要。在 C++11 及更高版本中,这可以通过使用 智能指针 来实现,例如 std::unique_ptr。事实上,C++ 为资源管理创建了一个很棒的成语,称为 RAII (Resource Allocation Is Initialization),这使它有别于许多其他语言。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-28
          • 2012-08-12
          • 1970-01-01
          • 1970-01-01
          • 2022-01-19
          • 2016-07-04
          • 2018-11-22
          • 2013-11-07
          相关资源
          最近更新 更多