可能重复:
How does delete[] “know” the size of the operand array?
在以下示例代码中:
int* p = new int[10];
delete[] p;
如何知道要删除多少元素?
我听说这个信息存储在已经分配的表的开头或其他地方之前的一种标题中 - 但在这种情况下,为什么我们不能使用像size(p)这样的函数来访问这个值10?它有什么特别的原因吗?这些标题中还存储了哪些其他信息?是特定于操作系统吗?编译器具体?
由于
答案 0 :(得分:4)
分配器保存的簿记信息绝对是编译器和分配器特定的。 C ++允许您使用自己的内置分配器替换全局和每个类。没有用于“窥视”此信息的标准API。
答案 1 :(得分:4)
完全没有说明,不同的实现方式也是如此 不同。通常情况下,如果信息甚至无法获得 type没有析构函数。
请注意,幕后管理的信息有两种:
分配了多少内存,以及有多少元素
需要调用的析构函数。如果没有析构函数,只有
第一个是必要的,并不一定是一对一的映射
在第一个和多个元素之间:在很多系统上,为
例如,对齐约束意味着new char[1]
和new char[2]
将分配相同的内存量。
答案 2 :(得分:0)
如何实现这一点的细节将是特定于编译器的。
关于为什么我们不能要求大小(p)的最后一点 - 我想分配器只存储内存量,而不是数组类型的细节。与C的sizeof()相同。对于所示示例,它不会返回10,但是在您的平台上存储10个标准整数需要多少字节。
希望这有帮助。