我们有可能删除动态分配的数组,但我们无法找出它们有多少个元素?我们不能只根据每个对象的大小来划分内存位置的大小吗?
Ton*_*roy 16
在C++中,两者都......
...是标准不需要以编程方式提供的实现细节,即使内存分配库必须记住前者和编译器后者,因此它可以在正确数量的元素上调用析构函数.
有时编译器可能会看到有一个恒定大小的分配,并且能够可靠地将其与相应的释放相关联,因此它可以生成为这些编译时已知值定制的代码(例如内联和循环展开),但是在复杂的使用中(当处理外部输入时,编译器可能需要在运行时存储和检索#个元素:#element计数器的足够空间可能会被放置 - 例如 - 紧接在为数组内容返回的地址之前或之后,删除[]了解这个惯例.在实践中,编译器可能会选择始终在运行时处理此问题,只是为了简化一致性.存在其他运行时可能性:例如
标准不提供编程访问,以确保实现在他们可能使用的优化(速度和/或空间)中不受约束.
(内存位置的大小可能大于所请求数量的元素所需的确切大小 - 内存分配库会记住该大小,该内存分配库可能是独立于C++编译器的黑盒库).
内存分配器会记住分配的大小,但不会将其提供给用户.这在C with malloc和C++中都是如此new.
"无法获得"内存位置的大小".如果你这样做
int *a = new int[N];
std::cout << sizeof(a);
Run Code Online (Sandbox Code Playgroud)
你会发现它打印sizeof(int *),这是不变的(对于给定的平台).