标题是不言自明的。很简单的问题。我认为这是 O(n),但想在明天的期末考试之前验证一下。
简短的回答是……这取决于情况。
If Q
是一个指向具有析构函数的对象数组的指针,那么delete[] Q
将需要调用所有这些析构函数。这将调用 O(n) 析构函数,其中 n 是数组中元素的数量。另一方面,如果Q
指向没有析构函数的对象数组(例如,int
或简单struct
s),那么不需要调用析构函数,只需要 O(1) 时间。
现在请注意,这些析构函数不必每次都在 O(1) 时间内运行。如果对象是,比如说,std::vector
对象,那么每个析构函数必须依次触发更多的释放。在不了解更多关于这些对象是什么的情况下,我们只能说,如果调用了析构函数,则如果析构函数是平凡的,则将调用 0 个析构函数,否则将调用 O(n) 析构函数。
但这忽略了堆分配器如何工作的实现细节。释放一个内存块可能需要 O(log K) 时间,其中 K 是已分配块的总数,或者无论有多少内存块,都可能需要 O(1) 时间,或者可能需要O(log log K) 等。如果不知道分配器如何工作,你真的无法确定。
简而言之,如果您纯粹专注于在将块交还给内存分配器之前清理对象所需的工作,则如果存储的对象具有析构函数,则会调用 O(n) 个析构函数,否则会调用 0 个析构函数。这些析构函数可能需要相当长的时间才能完成。然后,将内存块重新引入内存分配器会产生成本,这可能需要花费一定的时间。
希望这可以帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)