为什么对象初始化和销毁​​应该在用户定义的函数中完成?

zan*_*ngw -2 c++

在某些C++项目中,对象初始化销毁由用户定义的函数处理,而不是由constructorsdestructors.

class A  
{
public:
    A();
    virtual ~A();

    void Initialize(){
        // do some real object initialization here
    };
    void CleanUp(){
        // do some real object destroy here
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我可以说明为什么要这样做的一些原因:

  • 延迟初始化,以提高性能
  • 虚方法不能在构造函数和析构函数中使用
  • 目的地中没有参数,也无法覆盖
  • 构造函数和析构函数中不会抛出任何异常

我想知道是否还有其他情况我们应该在用户定义的函数中进行对象初始化和销毁​​?

Bat*_*eba 7

这是一个可怕的反模式.

  1. 构造函数将始终在一个线程中运行.那很有用.不要丢弃它.
  2. 该对象将在构造和初始化之间处于未定义状态.
  3. 您必须控制Initialize自己的线程安全性.
  4. 所有基类构造都将在之前发生Initialize:这超出了您的控制范围.
  5. 任何基类破坏都将在以下情况发生CleanUp:这超出了您的控制范围.
  6. 您必须控制CleanUp自己的线程安全性.
  7. 对象处于CleanUp和销毁之间的未定义状态.
  8. 析构函数将始终在一个线程中运行.那很有用.不要丢弃它.

(1)和(8)特别重要; 正好一个线程将调用构造函数和析构函数.它们有助于实现计划稳定性.