【问题标题】:Is there any way to get the length of an dynamically allocated array in C++? [duplicate]有没有办法在 C++ 中获取动态分配数组的长度? [复制]
【发布时间】:2011-11-21 00:24:22
【问题描述】:

可能重复:
Is there any way to determine the size of a C++ array programmatically? And if not, why?

我能否在 C++ 中获取动态分配数组的长度,如果不能,C++ 的删除运算符如何知道要释放多少元素。

我搜索了论坛,发现对于动态分配的数组,长度存储在数组头部之前的四个字节中或其他地方。我怎样才能得到这个值?

【问题讨论】:

  • @larsmans 是的,你是对的。我会参考你提供的链接。

标签: c++ delete-operator


【解决方案1】:

标头前的四个字节绝对是您不应该使用的实现细节。如果您需要知道数组的大小,请使用 std::vector。

【讨论】:

    【解决方案2】:

    简而言之,你不能。这是实现定义的,因此您无法访问它。但是,您可以(并且必须)将其存储在变量中,或使用一些控制大小的类型,例如 std::vectorstd::string 等。

    delete[] 运算符知道,因为 C++ 库的实现具有该信息,但 C++ 程序无法使用该信息。在某些实现中,就是这样,它存储在指针实际地址之前的一些字节中,但同样,您无法知道它。

    【讨论】:

    • 感谢您的回答。如果是这样,那么编译器怎么知道这个值来做delete[]呢?如果编译器可以访问这个值,为什么编译器对用户隐藏这个值?
    • 不是编译器,而是库。它隐藏在delete[] 的代码中,就像你隐藏类中的private 变量一样。摘要:您无法访问它。
    【解决方案3】:

    你不能。但是,std::vector<T> v(N)new T[N] 几乎完全相同,并提供 v.size(),因此您应该真正使用它,除非您有充分的理由要使用手动数组。

    【讨论】:

      【解决方案4】:

      另一种选择是定义自己的分配器(重载运算符 new[] 和 delete[] 用于您关心或执行的任何类 #define malloc mymalloc#define free myfree em> 取决于您的情况)。存储数组长度的位置取决于您,但通常会在数组开始之前分配额外的字节(无论内存对齐的适当数量是多少 - 通常为 4、8 或 16)并将长度存储在那里。

      【讨论】:

        猜你喜欢
        • 2011-07-04
        • 2011-04-15
        • 1970-01-01
        • 2011-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-05
        相关资源
        最近更新 更多