相同大小的动态和静态字符数组的字节分配不同?

Byte allocation different for dynamic vs. static char array of same size?

所以,我 运行 这段代码在我的 IDE 中。谁能解释为什么当这两个数组的大小应该相同时却没有为它们分配相同数量的内存?

char* dynamicCharArr = new char[15]; //allocates 8 bytes
cout << sizeof(dynamicCharArr) << endl;

char staticCharArr[15]; //allocates 15 bytes
cout << sizeof(staticCharArr) << endl;

sizeof(dynamicCharArr) 获取指向 char 数组的 指针 的大小。尝试 sizeof 使用不同大小的动态字符数组。它将是相同的(在同一系统上)。

new[] returns 指向它分配的内存的 指针 。您正在打印指针本身的大小,而不是所指向的已分配内存的大小。

sizeof() 无法查询分配的内存大小。如果你传入指针本身,你会得到指针的大小。如果传入取消引用的指针,您将获得数组 1 个元素的大小,而不是整个数组。在后一种情况下,您必须将该大小乘以传递给 new[].

的元素数

在这两个示例中,您的代码可访问的内存量都是 sizeof(char) * 15。但是您根本无法仅从指针获取该值,这就是 sizeof(dynamicCharArr) 不起作用的原因。在固定数组中,大小是数组类型的一部分,这就是 sizeof(staticCharArr) 起作用的原因。

但是,请注意,new[] 为动态数组分配的 物理内存 总是略大于 由相同元素数的固定数组使用的内存,因为 new[] 分配额外的内部元数据供 delete[] 使用,甚至是内存管理器本身。该元数据将包括(内存管理器内部需要的任何其他内容,如调试信息、块跟踪等)new[] 分配的元素数量,因此 delete[] 知道要销毁多少元素。但是 sizeof() 不知道(或不关心)那个元数据。