sla*_*ber 3 c++ memory-management new-operator
在"The C++ Programming Language"一书中,Stroustrup说:
"要释放由new分配的空间,删除和删除[]必须能够确定分配的对象的大小.这意味着使用new的标准实现分配的对象将占用比静态对象稍多的空间.通常,一个word用于保存对象的大小.
这意味着分配的每个对象new的大小都位于堆中的某个位置.位置是否已知,是否可以访问它?
实际上,内存分配器的典型实现也存储了一些其他信息.
没有标准的方法来访问这些信息,实际上标准中没有任何内容说明存储了什么信息(大小以字节为单位,元素数量及其大小,指向最后一个元素的指针等).
编辑:如果你有对象的基地址和正确的类型,我怀疑分配的大小可以相对容易找到(不一定"完全免费").但是,有几个问题:
为了说明这可能出错,让我们说这样做:
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)
| 归档时间: |
|
| 查看次数: |
2932 次 |
| 最近记录: |