26

为什么无法获得以这种方式分配的缓冲区的长度。

AType * pArr = new AType[nVariable];

当同一个数组被释放时

delete [] pArr;

运行时必须知道要释放多少。在删除数组之前有什么方法可以访问长度。如果没有,为什么没有提供这样的 API 来获取长度?

4

8 回答 8

9

在删除数组之前有什么方法可以访问长度吗?

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


附带说明一下,有两个选项可以实际克服这个问题:

  1. 您可以简单地使用 astd::vector它为您提供成员函数,例如size()
  2. 您可以简单地自己做簿记。

new 至少根据您的要求分配足够的内存。
您已经知道您请求了多少内存,因此您可以轻松计算长度。您可以使用 找到每个项目的大小sizeof

Total memory requested / Memory required for 1 item = No of Items
于 2012-09-27T08:37:47.227 回答
6

运行时确实知道分配了多少。然而,这些细节是编译器特定的,所以你没有任何跨平台的方式来处理它。

如果您想要相同的功能并且能够跟踪大小,您可以使用 std::vector 如下:

std::vector< AType > pArr( nVariable );

这也具有使用 RAII 的额外优势。

于 2012-09-27T08:39:01.270 回答
3

delete操作员不需要知道释放分配内存的大小,就像系统free调用不需要一样。这是因为该问题留给了操作系统,而不是编译器运行时系统。

于 2012-09-27T08:39:37.887 回答
3

运行时必须释放与其分配相同的数量,并且它确实以某种方式(通常非常间接)跟踪这一点。但是从分配的数量到元素的数量没有可靠的方法:分配的数量不能小于元素数量乘以每个元素的大小,但通常会更多。例如,对齐考虑意味着new char[5]并且new char[8]通常会分配相同数量的内存,并且有各种分配策略可能导致分配比严格必要的内存更多的内存。

于 2012-09-27T10:37:45.897 回答
2

不,不是。至少不是以独立于平台的、定义的方式。

大多数实现都在实际数组之前存储动态分配数组的大小。

于 2012-09-27T08:39:31.753 回答
1

C++ 中没有可移植的方法来从原始指针获取动态分配的数组的大小。

在 MSVC 和 WIN32 下,您可以使用 _msize(void*) 函数获取分配块的大小。

有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/z2s077bc.aspx

于 2017-01-25T13:43:58.657 回答
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;
};
于 2017-01-25T12:46:07.290 回答
0

我使用这种“脏”方法,仅用于调试目的:

T *p = new T[count];
size_t size = (char*)&(p[count]) - (char*)p;

这给出了实际数据的大小,但没有给出编译器可能分配的任何额外大小。

对于已经对齐的类型 T,它等于:

size_t size = sizeof(T) * count;

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

于 2021-07-07T08:56:40.507 回答