![]() |
1
19
它将删除大小为9的数组。 它删除指针指向的数组。 未指定大小信息的存储方式,因此每个编译器可能以不同的方式实现它,但通常的方法是在数组之前分配一个额外的块。也就是说,当您这样做时:
它实际上分配了一个包含6个整数的数组,并将数组大小存储在第一个元素中。然后返回指向第二个元素的指针。所以要找到大小,delete[]基本上只需要读取表[-1]。 这是一种常见的方法,但语言标准并没有具体说明这一点 必须 我们必须这样做。只是它必须 工作 . 另一种方法可能是使用数组的地址作为某个全局哈希表的键。只要产生正确的结果,任何方法都是有效的。 |
![]() |
2
17
Section 16.14 C++的FAQ Lite回答了这个问题:
|
![]() |
3
4
如何做到这一点是编译器特有的细节。但是,如果没有内存损坏,调用delete[],将始终删除正确数量的元素。有几种方法可以实现这一点,但一种简单的方法是将长度隐藏在内存中。 这里有一个很好的简单的方法来实现这个演示。假设您的代码调用newint[10]。编译器不分配10*sizeof(int),而是分配(10*sizefo(int))+sizeof(size_t)。然后,它返回一个指向您的指针,该指针从起点开始偏移大小。在初始大小的空间中,它写入数字10。现在,当您调用delete[]并传入一个指针时,编译器只会向后调整字节大小并查找要删除的元素数。 |
![]() |
4
2
delete[]的工作方式取决于实现,但全局new运算符以某种方式将描述符与分配的内存相关联(在大多数情况下,它是在分配的内存之前,或存储在查找表中)。描述符包含分配的内存的实际大小。 在第二个代码示例中,delete[]将正确删除int的九元素数组,而原来的五元素数组将被泄漏。 |
![]() |
5
1
该机制依赖于实现,但不会被您在示例中重新分配指针“愚弄”。它将释放大小为9的数组,就像您告诉它的那样(在本例中,将出现内存泄漏,因为大小为5的数组现在没有任何指向它的内容)。 |
![]() |
6
0
|
![]() |
7
0
您可以想象,系统将表的大小存储在如下结构中:
在分配内存时,系统会返回一个指向“yourData”的指针。 |
![]() |
8
0
在new[]/delete[]情况下,内存方面发生的情况与new/delete情况下发生的情况相同/相似。。。大小信息存储在(更大的)分配块本身中。数组有趣的是,它还使用大小信息来知道有多少对象需要调用析构函数。 |
![]() |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
![]() |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
![]() |
rainer · 后台插入程序的初始化 1 年前 |
![]() |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |