使用 malloc() 时出现意外大小
Unexpected size when using malloc()
我想测试我的知识,并编写了一个小程序,看起来像这样:
#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(资源分配即初始化(,这使它与许多其他语言区分开来。
相关文章:
- 如果没有malloc,链表实现将失败
- 在C++中对T*类型执行std::move的意外行为
- malloc() 可能出现内存泄漏
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 处理除以零会导致<csignal>意外行为
- vscode下的Arduino代码出现意外编译错误
- 使用++运算符会导致意外的结果
- 套接字读取后,我在缓冲区中看到意外输入
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 使用vscode调试时,GDB意外退出
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 尝试将字符串/字符转换为整数会产生意外结果
- 在C++中创建队列 - 什么是 malloc 错误?
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 如何在 malloc 内存中初始化非 POD 数据
- C++标头错误 C2238 意外标记";"
- 使用 malloc() 时出现意外大小
- 在调用malloc之后,我得到了一个意外的大小