我知道C++中没有办法获取动态创建的数组的大小,比如:
int* a;
a = new int[n];
我想知道的是:为什么?人们只是在 C++ 的规范中忘记了这一点,还是有技术原因?
信息不是存储在某个地方吗?毕竟命令
delete[] a;
似乎知道它必须释放多少内存,所以在我看来 delete[]
有某种方式知道 a
的大小。
最佳答案
这是对“不要为不需要的东西付费”这一基本规则的延续。在您的示例中, delete[] a;
不需要 需要知道数组的大小,因为 int 没有析构函数。如果你写了:
std::string* a;
a = new std::string[n];
...
delete [] a;
然后 delete
必须调用析构函数(并且需要知道要调用多少个) - 在这种情况下 new
必须保存该计数。然而,鉴于它并非需要在所有情况下都保存,Bjarne 决定不授予对它的访问权限。
(事后看来,我认为这是一个错误......)
当然,即使使用 int
,something 也必须知道分配内存的大小,但是:
出于对齐和方便的原因,许多分配器会将大小四舍五入到某个方便的倍数(比如 64 字节)。分配器知道一个 block 是 64 字节长 - 但它不知道这是因为
n
是 1 ... 还是 16。C++ 运行时库可能无法访问已分配 block 的大小。例如,如果
new
和delete
在后台使用malloc
和free
,那么 C++ 库没有了解malloc
返回的 block 大小的方法。 (当然,通常new
和malloc
都是同一个库的一部分 - 但并非总是如此。)
关于C++ 不会告诉您动态数组的大小。但为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36471101/