c++ - delete[]指针起作用的时候,为什么获取不到指向的数组的大小呢?

标签 c++

使用堆分配数组的常见方法是:

SomeType * arr = new SomeType[15454];
//... somewhere else 
delete [] arr;

为了执行 delete [] arr,C 运行时必须知道与指针关联的内存缓冲区的长度。我说得对吗?

那么原则上应该可以以某种方式访问​​信息?可以使用某些库访问它吗?我是在想。我知道它不是语言的核心部分,因此它会依赖于平台。

最佳答案

你没看错。信息就在那里。但是没有获得它的标准方法。

如果您使用的是 Windows,则有一个 _msize() 方法,它可能会为您提供内存块的大小,但不一定准确。 (报告的内存块大小可能会四舍五入到最接近的较大对齐点。)参见 MSDN - _msize

如果这确实是您必须拥有的东西,您可以通过覆盖 new 来试试运气,分配一个稍大的内存块,将其大小存储在开头,并返回一个指向字节的指针大小之后。然后您可以编写自己的 msize() 来返回该大小。当然,您还需要覆盖 delete。但是太麻烦了,能避免最好避免。如果你那样走,你只会发现痛苦。

关于c++ - delete[]指针起作用的时候,为什么获取不到指向的数组的大小呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45503969/

相关文章:

c++ - 简化涉及在 C++ 中连接整数的 std::string 构造

c++ - 编译器将 cpu 寄存器中的这种结构传递给函数是否有意义?

c++ - 如果没有显式限定名称,如何调用纯虚函数?

c++ - 在 C++ 中创建派生抽象类的实例

c++ - 排序链表在每次执行时插入重复项

c++ - 使用 ASSIMP 和 GLSL 的骨骼动画 : bone uniform array size

c++ - 对 boost::system::generic 的另一个 undefined reference

c++ - 无法获得boost::spirit解析器和词法分析器,用于除std::string或int或double以外的 token 类型

c++ - 即使在使用 skip_permission_denied 时,std::filesystem 递归迭代器也会抛出 permission_denied

c++ - 构造中的单个值与构造的参数列表