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

时间:2014-11-28 08:45:32

标签: 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
    }
}

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

  • Lazy initialization,以提高效果
  • 虚方法不能在构造函数和析构函数中使用
  • 目的地中没有参数且无法覆盖
  • 构造函数和析构函数
  • 中不会抛出任何异常

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

1 个答案:

答案 0 :(得分:6)

这是一种可怕的反模式。

  1. 构造函数将始终在一个线程中运行。那很有用。不要丢弃它。
  2. 对象在构造和初始化之间将处于未定义状态。
  3. 您必须自己控制Initialize的线程安全性。
  4. 所有基类构造都将在Initialize之前进行:这是您无法控制的。
  5. 任何基类破坏都将在CleanUp之后发生:这是您无法控制的。
  6. 您必须自己控制CleanUp的线程安全性。
  7. 对象在CleanUp和销毁之间处于未定义状态。
  8. 析构函数将始终在一个线程中运行。那很有用。不要丢弃它。
  9. (1)和(8)特别重要;正好一个线程将调用构造函数和析构函数。它们有助于实现计划的稳定性。