C++ 不会告诉您动态数组的大小。但为什么?

标签 c++ dynamic-arrays

我知道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 决定不授予对它的访问权限。

(事后看来,我认为这是一个错误......)

当然,即使使用 intsomething 也必须知道分配内存的大小,但是:

  • 出于对齐和方便的原因,许多分配器会将大小四舍五入到某个方便的倍数(比如 64 字节)。分配器知道一个 block 是 64 字节长 - 但它不知道这是因为 n 是 1 ... 还是 16。

  • C++ 运行时库可能无法访问已分配 block 的大小。例如,如果 newdelete 在后台使用 mallocfree,那么 C++ 库没有了解 malloc 返回的 block 大小的方法。 (当然,通常 newmalloc 都是同一个库的一部分 - 但并非总是如此。)

关于C++ 不会告诉您动态数组的大小。但为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36471101/

相关文章:

c++ - 如何让共享指针指向的对象?

c++ -/usr/bin/ld : cannot find -lLLVMJIT(and -lLLVMipa) in ubuntu 16. 04

C++类中的动态数组

c++ - 如果内存不足抛出 Bad_alloc 异常

Delphi 2006 - 分配动态数组函数结果

c++ - 改变动态数组的长度?

c++ - 我可以使用 vsinstr 检测 exe 文件吗?

c++ - nullptr 初始值和 WinAPI NULL 返回

c++ - a+(-a) 操作期间溢出

c - 如何在C中实现动态数组?