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