为什么不能以这种方式获得缓冲区的长度。
AType * pArr = new AType[nVariable];
取消分配相同的数组时
delete [] pArr;
运行时必须知道解除分配的数量。在删除数组之前是否有任何方法可以访问该长度。如果不是,为什么没有提供这样的API来获取长度?
答案 0 :(得分:6)
在删除数组之前是否有任何方法可以访问该长度?
没有。没有办法确定。
该标准不要求实现记住并提供通过new
请求的元素数量的细节
实现可以简单地在分配的内存块的末尾插入特定的位模式,而不是记住元素的数量,并且可以在释放内存时简单地查找模式。
简而言之,它只是一个重要的细节。
另外,有两个选项可以解决这个问题:
std::vector
,它为您提供size()
或 new
atleast 根据您的要求分配足够的内存
您已经知道您请求了多少内存,因此您可以轻松计算长度。您可以使用sizeof
查找每个项目的大小。
Total memory requested / Memory required for 1 item = No of Items
答案 1 :(得分:6)
运行时知道分配了多少。但是,这些细节是编译器特定的,因此您没有任何跨平台的方法来处理它。
如果您想要相同的功能并且能够跟踪大小,您可以使用std :: vector,如下所示:
std::vector< AType > pArr( nVariable );
这也有使用RAII的额外优势。
答案 2 :(得分:3)
delete
运算符不需要知道释放已分配内存的大小,就像free
系统调用没有那样。这是因为该问题留给了操作系统而不是编译器运行时系统。
答案 3 :(得分:3)
运行时必须释放与分配的数量相同的数量,并且确实如此
以某种方式(通常非常间接地)跟踪这一点。但
没有可靠的方法从分配数量到数量
要素:分配的数量不能少于数量
元素乘以每个元素的大小,但通常会更多。
例如,对齐注意事项意味着new char[5]
和new
char[8]
通常会分配相同数量的内存,并且
各种分配策略可以导致更多的内存
被分配的是必要的。
答案 4 :(得分:2)
不,不是真的。至少不是与平台无关的,定义的方式。
大多数实现在实际数组之前存储动态分配数组的大小。
答案 5 :(得分:1)
C ++中没有可移植的方法来从原始指针获取动态分配的数组的大小。
在MSVC和WIN32下,您可以使用_msize(void *)函数获取已分配块的大小。
有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/z2s077bc.aspx。
答案 6 :(得分:0)
为什么不这样的额外信息:
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;
};
答案 7 :(得分:0)
我使用这种“肮脏”的方法,仅用于调试目的:
T *p = new T[count];
size_t size = (char*)&(p[count]) - (char*)p;
这给出了实际数据的大小,但没有给出编译器可能分配的任何额外大小。
对于已经对齐的类型 T,它等于:
size_t size = sizeof(T) * count;
当然,如果您不知道数组中项目的数量,这将不起作用。