delete[] 如何"know"操作数数组的大小?
How does delete[] "know" the size of the operand array?
Foo* set = new Foo[100];
// ...
delete [] set;
您不会将数组的边界传递给delete[]
。但是这些信息存储在哪里?它是标准化的吗?
当您在堆上分配内存时,分配器将跟踪您分配的内存量。这通常存储在您分配的内存之前的"头"段中。这样,当需要释放内存时,取消分配器确切地知道要释放多少内存。
的方法之一是分配更多的内存,并在头元素中存储元素计数。
示例如何完成:
这里
int* i = new int[4];
编译器将分配 sizeof(int)*5
个字节。
int *temp = malloc(sizeof(int)*5)
将在前 sizeof(int)
个字节中存储"4">
*temp = 4;
并设置i
i = temp + 1;
因此,i
将指向一个包含 4 个元素的数组,而不是 5 个。
和删除
delete[] i;
将按以下方式处理:
int *temp = i - 1;
int numbers_of_element = *temp; // = 4
... call destructor for numbers_of_element elements
... that are stored in temp + 1, temp + 2, ... temp + 4 if needed
free (temp)
信息未标准化。但是,在我所研究的平台中,此信息存储在第一个元素之前的内存中。因此,理论上您可以访问它并检查它,但这不值得。
这也是为什么在使用 new [] 分配内存时必须使用 delete [] 的原因,因为 delete 的数组版本知道(以及在哪里(它需要查找以释放适量的内存 - 并为对象调用适当数量的析构函数。
C++标准中定义为特定于编译器。这意味着编译器的魔力。它可以打破至少一个主要平台上的重要对齐限制。
你可以通过意识到delete[]
只为new[]
返回的指针定义来考虑可能的实现,这可能与operator new[]
返回的指针不同。野外的一个实现是将数组计数存储在operator new[]
返回的第一个 int 中,并new[]
返回一个指针偏移量。(这就是为什么非平凡的对齐方式可以破坏new[]
的原因。
请记住,operator new[]/operator delete[]
!= new[]/delete[]
。
另外,这与 C 如何知道 malloc
分配的内存大小正交。
基本上它在内存中的排列方式为:
[信息][你要求的记忆...]
其中 info 是编译器用来存储分配的内存量的结构,以及什么不是。
不过,这取决于实现。
这不是规范中的东西 - 它是依赖于实现的。
因为要"删除"的数组应该使用"new"运算符创建。 "新"操作应该将该信息放在堆上。 否则,new 的其他用途如何知道堆的结束位置?
这是一个比你一开始想象的更有趣的问题。此回复是关于一种可能的实现。
首先,虽然在某种程度上你的系统必须知道如何"释放"内存块,但底层的malloc/free(new/delete/new[]/delete[]通常称之为(并不总是记得你要求的内存量,它可以被四舍五入(例如,一旦你超过4K,它通常会四舍五入到下一个4K大小的块(。
因此,即使可以获得内存块的大小,也不能告诉我们新内存中有多少个值,因为它可以更小。因此,我们必须存储一个额外的整数,告诉我们有多少个值。
除了,如果正在构造的类型没有析构函数,那么 delete[] 除了释放内存块之外不需要做任何事情,因此不必存储任何东西!
它不是标准化的。在Microsoft的运行时中,new 运算符使用 malloc((,delete 运算符使用 free((。因此,在此设置中,您的问题等效于以下内容:free(( 如何知道块的大小?
在幕后进行一些簿记,即在 C 运行时中。
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '