为什么无法获取以此方式分配的缓冲区的长度。
AType * pArr = new AType[nVariable];
当同一数组被释放时
delete [] pArr;
运行时需要知道需要释放的内存大小。是否有方法在删除数组之前访问其长度?如果没有,为什么没有提供可以获取长度的API?
为什么无法获取以此方式分配的缓冲区的长度。
AType * pArr = new AType[nVariable];
当同一数组被释放时
delete [] pArr;
运行时需要知道需要释放的内存大小。是否有方法在删除数组之前访问其长度?如果没有,为什么没有提供可以获取长度的API?
Total memory requested / Memory required for 1 item = No of Items
C++ RTS
可能无论如何都不知道该信息,因为(比如说)它由操作系统保存,并且他不愿意向您透露(但它可以公开一个函数,让您删除内存块并将函数应用于正在删除的内存,例如调用 dtors)。简而言之,这是一种情况,其中 C++ RTS 依赖于更低级别的 RTS,因此标准对实现施加了最低限制以降低成本。 - akappa运行时确实知道分配了多少内存。 但是这些细节取决于编译器,因此您没有任何跨平台的方法可以处理它。
如果您想要相同的功能并能够跟踪大小,则可以使用std::vector如下:
std::vector< AType > pArr( nVariable );
这样做还有一个额外的优点,它也使用了 RAII。
delete
操作符不需要知道大小就可以释放已分配的内存,就像 free
系统调用一样。这是因为这个问题留给操作系统而不是编译器的运行时系统。
运行时必须释放与分配的相同数量,并以某种方式(通常非常间接地)跟踪此内容。但是,没有可靠的方法可以从分配的数量转换为元素的数量:分配的数量不能少于每个元素的大小乘以元素数,但通常会更多。例如,对齐考虑因素意味着 new char[5]
和 new char[8]
通常会分配相同数量的内存,并且有各种分配策略可以导致分配比严格必要的内存更多。
T *p = new T[count];
size_t size = (char*)&(p[count]) - (char*)p;
size_t size = sizeof(T) * count;
在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;
};
std::vector<AType> pArr(nVariable);
。这将在内部使用动态分配,您可以随时方便地使用.size()
。 - iammilind