使用 malloc() 时出现意外大小

Unexpected size when using malloc()

本文关键字:意外 malloc 使用      更新时间:2023-10-16

我想测试我的知识,并编写了一个小程序,看起来像这样:

#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)),输出也不会改变。

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

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

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

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

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

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

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

  1. C++您可以使用new运算符动态分配内存。使用 malloc 的选项用于处理 c 样式的 API,在需要时动态分配将由 c 自由函数取消分配。为了进行这样的分配,最好使用 std::malloc,您可以在此链接(cpp 参考(中阅读。
  2. 运算符 sizeof 正在计算静态类型的大小,这意味着它为您提供整数指针的大小,该大小是恒定的,具体取决于您的 CPU 体系结构。
  3. 在C++中使用原始指针是不明智的,您应该始终确保对于在内存中动态创建的每个项目都有一个所有者,即负责在不再需要时将其删除的人。在 C++11 及更高版本中,这可以通过使用智能指针(如 std::unique_ptr(来实现。事实上,C++为资源管理创建了一个伟大的习语,称为RAII(资源分配即初始化(,这使它与许多其他语言区分开来。