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