为什么无法获得以这种方式分配的缓冲区的长度。查找动态分配数组的大小
AType * pArr = new AType[nVariable];
当同一阵列被释放
delete [] pArr;
运行时必须知道有多少解除分配。在删除数组之前是否有任何方法可以访问该长度。如果不是,为什么不提供这样的API来获取长度?
为什么无法获得以这种方式分配的缓冲区的长度。查找动态分配数组的大小
AType * pArr = new AType[nVariable];
当同一阵列被释放
delete [] pArr;
运行时必须知道有多少解除分配。在删除数组之前是否有任何方法可以访问该长度。如果不是,为什么不提供这样的API来获取长度?
是否有任何方法可以在删除数组之前访问该长度?
不,没有办法确定。
该标准不要求实现记住并通过new
提供请求的元素数的细节。
实现可能只是在分配的内存块末尾插入特定的位模式,而不是记住元素的数量,并且可能在释放内存的同时简单地查找模式。
简而言之,它完全是一个无限细节。
在一个侧面说明,有2个选项,切实解决这个问题:
std::vector
提供您喜欢size()
或new
ATLEAST分配,你要求足够的内存一样多。
您已经知道您要求多少内存,以便您可以轻松计算长度。您可以使用sizeof
找到每件商品的尺寸。
Total memory requested/Memory required for 1 item = No of Items
这downovte是因为......? –
我没有降低你的评价,但我认为问题在于他问为什么这个标准没有提供这个标准,而你说这是因为标准说的那样。他要求的是一个理由,而不是为了解决具体问题。 – akappa
@akappa:我的回答指出了理由,实现可以有效/更好地记录分配的内存,因此标准不会强制实现以特定方式执行。实际上,答案甚至说出这样一种方式。既然你说这不是理由,请启发我如何/为什么你认为这不是一个理由? –
运行时知道分配了多少。然而,这些细节是编译器特定的,所以你没有任何跨平台的方式来处理它。
如果你想相同的功能,并能够跟踪大小,你可以按如下方式使用一个std ::向量:
std::vector<AType> pArr(nVariable);
这与使用RAII以及附加优势。
不,不是。至少不是平台无关的,定义的方式。
尽管大多数实现会在实际数组之前存储动态分配数组的大小。
真的。我见过的那些没有。 –
@JamesKanze MSVS肯定会。 –
我刚用VC10试了一下。如果我做'new char [10]',则返回的指针前面的'size_t'包含'917978'。 (使用g ++时,它包含'17',它实际上可能与分配的内存量有关,因为对齐考虑需要四舍五入到8的下一个倍数。) –
delete
运营商不需要知道大小来释放分配的内存,就像free
系统调用不需要。这是因为这个问题留给操作系统而不是编译器运行时系统。
不是真的,删除操作和免费库函数需要知道这一点。我认为许多实现不会将堆分配的内存返回给操作系统,而是重用它,即使它们返回内存,在释放/删除调用和返回内存的系统调用之间也没有1:1映射(这是因为操作系统通常不会允许您以小块返回内存,但会以页面大小的倍数)。 –
至少对于非POD数据类型,运行时必须知道它,因为它必须调用dtors。对于POD数据类型,可以肯定地说C++ RTS可能会或可能不知道已经分配了多少空间,因为裸内存处理不符合标准。 – akappa
运行时必须解除分配,因为它分配相同量,并且它的这个 跟踪以某种方式(通常非常间接地)。但 有一个从分配给 元素个数量越来越没有可靠的方法:分配不能少于 元素乘以每个元素的数量大小的量,但它往往会更多。例如,对齐方面的考虑意味着new char[5]
和new char[8]
将经常分配相同数量的存储器,并且存在各种分配策略,这些分配策略可能会导致明显需要分配明显更多的存储器内存 。
为什么不一点额外的信息是这样的:
template <typename T> class AType
{
public:
AType(size_t s) : data(0)
{
a_size = s;
data = new T[s];
}
~AType() {
if (data != nullptr)
delete [] data;
}
size_t getSize() const
{
return a_size * sizeof(T);
}
private:
size_t a_size;
T* data;
};
有一个在C++中没有可移植的方式来获得原始指针动态分配的数组的大小。
在MSVC和WIN32你可以得到与_msize(无效*)函数分配的内存块的大小。
看到https://msdn.microsoft.com/en-us/library/z2s077bc.aspx进一步的细节。
优秀问题1 –
最佳的方法是使用,'的std ::矢量帕尔(nVariable);'。这在内部使用动态分配进行分配,并且'.size()'总是方便的。 –
iammilind
[这个C++常见问题。(http://www.parashift.com/c++-faq-lite/num-elems-in-new-array.html) – jrok