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

时间:2012-09-27 08:35:32

标签: c++ size new-operator dynamic-allocation

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

AType * pArr = new AType[nVariable];

取消分配相同的数组时

delete [] pArr;

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

8 个答案:

答案 0 :(得分:6)

  

在删除数组之前是否有任何方法可以访问该长度?

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


另外,有两个选项可以解决这个问题:

  1. 您可以简单地使用std::vector,它为您提供size()
  2. 等成员函数
  3. 您可以自己完成簿记。
  4. 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;

当然,如果您不知道数组中项目的数量,这将不起作用。