获得动态分配的数组大小

sla*_*ber 3 c++ memory-management new-operator

在"The C++ Programming Language"一书中,Stroustrup说:

"要释放由new分配的空间,删除删除[]必须能够确定分配的对象的大小.这意味着使用new的标准实现分配的对象将占用比静态对象稍多的空间.通常,一个word用于保存对象的大小.

这意味着分配的每个对象new的大小都位于堆中的某个位置.位置是否已知,是否可以访问它?

Mat*_*son 6

实际上,内存分配器的典型实现也存储了一些其他信息.

没有标准的方法来访问这些信息,实际上标准中没有任何内容说明存储了什么信息(大小以字节为单位,元素数量及其大小,指向最后一个元素的指针等).

编辑:如果你有对象的基地址和正确的类型,我怀疑分配的大小可以相对容易找到(不一定"完全免费").但是,有几个问题:

  1. 它假设你有原始指针.
  2. 它假定内存与运行时库的分配代码完全分配.
  3. 它假设分配器不以某种方式"舍入"分配地址.

为了说明这可能出错,让我们说这样做:

size_t get_len_array(int *mem)
{
   return allcoated_length(mem);
}

... 
void func()
{
    int *p = new int[100];
    cout << get_len_array(p); 
    delete [] p;
}

void func2()
{
    int buf[100];
    cout << get_len_array(buf); // Ouch!
}
Run Code Online (Sandbox Code Playgroud)