查找动态分配的数组的大小

Ram*_*Ram 24 c++ size new-operator dynamic-allocation

为什么不能以这种方式获得缓冲区的长度.

AType * pArr = new AType[nVariable];
Run Code Online (Sandbox Code Playgroud)

取消分配相同的数组时

delete [] pArr;
Run Code Online (Sandbox Code Playgroud)

运行时必须知道释放多少.在删除数组之前是否有任何方法可以访问该长度.如果不是,为什么没有提供这样的API来获取长度?

Alo*_*ave 6

在删除数组之前有没有办法访问长度?

不,没有办法确定.
该标准不要求实现记住并提供所请求的元素数量的细节new.
实现可以简单地在分配的存储块的末尾插入特定的位模式而不是记住元素的数量,并且可以在释放存储器的同时简单地查找模式.
简而言之,它只是一个重要的细节.


另外,有两个选项可以实际克服这个问题:

  1. 你可以简单地使用一个std::vector为你提供像size()或的成员函数
  2. 您可以自己完成簿记.

new 至少根据您的要求分配足够的内存.
您已经知道您请求了多少内存,因此您可以轻松计算长度.您可以使用找到每个项目的大小sizeof.

Total memory requested / Memory required for 1 item = No of Items
Run Code Online (Sandbox Code Playgroud)

  • 我没有对你进行投票,但我认为问题在于他在问为什么标准没有提供这一点,你说这是因为标准说的那样.他要求的理由,而不是解决具体问题. (3认同)

Goz*_*Goz 6

运行时知道分配了多少.但是,此类详细信息是特定于编译器的,因此您没有任何跨平台方式来处理它.

如果您想要相同的功能并且能够跟踪大小,您可以使用std :: vector,如下所示:

std::vector< AType > pArr( nVariable );
Run Code Online (Sandbox Code Playgroud)

这还具有使用RAII的额外优势.