手动析构函数调用是否表明设计不佳?
人们普遍认为手动调用析构函数表明设计不佳。但是,此规则也有例外。
需要手动析构函数调用的一种情况是,仅需要销毁对象而不释放其分配的内存。这通常发生在内存分配和释放与对象构造和销毁分开处理的情况下。在这种情况下,对象是通过在现有内存块上放置 new 来构造的,并手动调用析构函数来消除它们。
考虑以下示例:
char buffer[sizeof(MyClass)]; { MyClass* p = new(buffer)MyClass; p->dosomething(); p->~MyClass(); } { MyClass* p = new(buffer)MyClass; p->dosomething(); p->~MyClass(); }
另一个值得注意的实例,其中手动析构函数调用是 std::vector 使用的默认 std::allocator。元素是在push_back期间在向量内构造的,但内存是预先分块分配的。因此,vector::erase 可以消灭元素,而不必释放底层内存,特别是如果很快就会进行 Push_back 操作。
尽管手动析构函数调用偏离了严格的 OOP 原则,但它们可能适合内存管理的情况。独立于对象生命周期。此外,在为此目的而设计的类中本地实现此方法可以称为健全设计。
以上是什么时候手动调用析构函数是一个好的设计选择?的详细内容。更多信息请关注PHP中文网其他相关文章!