gpt4 book ai didi

c++ - delete(非数组形式)是否知道 new 或 new[] 分配的内存总量

转载 作者:搜寻专家 更新时间:2023-10-31 01:38:39 25 4
gpt4 key购买 nike

这个问题是作为 Does delete[] deallocate memory in one shot after invoking destructors? 的一部分提出的但作为一个单独的问题移出。

似乎(如果错误请纠正我)deletedelete[] 之间的唯一区别是delete[] 将获取数组大小信息并对所有数组调用析构函数,而 delete 将析构唯一的第一个。特别是,delete 还可以访问有关 new[] 分配的总内存量的信息。

如果不关心动态分配的数组元素的析构,只关心由 newnew[] 分配的内存被释放,delete 似乎能够完成同样的工作。

How does delete[] "know" the size of the operand array?问题的已接受答案有一条来自@ AnT 的评论我引用

Also note that the array element counter is only needed for types with non-trivial destructor. For types with trivial destructor the counter is not stored by new[] and, of course, not retrieved by delete[]

这条评论表明,一般来说,delete 表达式知道分配的整个内存量,因此知道最终要释放多少内存一次性,即使内存包含一个元素数组。所以如果一个人写

auto pi = new int[10];
...
delete pi;

即使标准认为这是 UB,但在大多数实现中,这不应该泄漏内存(尽管它不可​​移植),对吧?

最佳答案

在 C++ 标准下,在用 new[] 分配的东西上调用 delete 只是未定义的行为,调用 delete[] 也是如此用 new 分配的东西。

在实践中,new[] 将通过类似malloc 的方法分配内存,new 也是如此。 delete 将销毁指向的对象,然后将内存发送到类似free 的位置。 delete[] 将销毁数组中的所有对象,然后将内存发送到类似free 的地方。 new[] 可能会分配一些额外的内存,以传递给 delete[] 来为 delete[] 提供要销毁的元素数量,还是不是。

如果使用实际的 malloc/free,那么一些实现将允许使用指向 malloc block 中任何地方的指针。其他人不会。需要将与从 malloc 获得的值完全相同的值传递给 free 才能定义它。这里有一个问题,如果 new[] 为数组大小/元素步幅分配了一些额外的空间并将其卡在 block 之前,那么 delete 被传递给指向第一个元素的指针,然后 delete 将传递给 free 一个不同于 new[]malloc。 (我认为有一种架构会发生这样的事情。)

像大多数未定义的行为一样,您不能再依赖于审核您编写的代码,而是您现在致力于审核生成的程序集,您与之交互的 C/C++ 标准库,然后才能确定您要执行的行为是否正确。实际上,这是一种无法实现的负担,因此您的代码最终会产生负值,即使您在一次实际检查时检查事情是否按照您预期的方式工作。您将如何确保每次编译器版本、标准库版本、操作系统版本、系统库或编译器发生更改时(对生成的二进制文件及其行为)进行相同的检查?

关于c++ - delete(非数组形式)是否知道 new 或 new[] 分配的内存总量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32508952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com