”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 什么时候手动调用析构函数是合法的做法?

什么时候手动调用析构函数是合法的做法?

发布于2024-11-17
浏览:852

When is Manually Calling a Destructor a Legitimate Practice?

什么时候手动调用析构函数是合理的?

手动调用析构函数表明存在缺陷的设计这一概念经常被断言。然而,这引出了一个问题:这条规则有例外吗?

反例:需要手动析构函数调用的情况

确实,在某些情况下有必要这样做显式调用析构函数:

1.受控内存释放:

当内存分配和释放独立于对象构造和销毁进行管理时,手动析构函数调用变得至关重要。在这种情况下,对象构造是通过在现有内存缓冲区上放置 new 来进行的,而销毁是通过显式析构函数调用来进行的。

char buffer[sizeof(MyClass)];

{
     MyClass* p = new(buffer)MyClass;
     p->dosomething();
     p->~MyClass();
}

2.特定内存分配器:

另一个例子是 std::vector 对默认 std::allocator 的使用。这里,元素是在push_back操作期间构造的,但是内存分配发生在元素构造之前的块中。因此,vector::erase 必须销毁元素,而不必重新分配内存,特别是在即将进行进一步的 Push_backs 的情况下。

含义:

手动调用析构函数可能违反严格的规定OOP 原则模糊了对象和内存管理之间的界限。然而,在低级编程或内存分配和释放解耦的场景中,它可能是合适的。

此外,虽然随机手动析构函数调用可以指示设计问题,但它在专用类中的本地化使用可以是被认为是合理的做法。

最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3