你能禁止本地的实例化吗?

时间:2016-05-25 09:52:14

标签: c++ multithreading scope instantiation

我有一个用于自动过程监控的帮助程序,因为它有点像一个"火灾和忘记"机制,一个很大的缺陷就是你可以像这样使用它:

  

MyClass c(过程);

但是当c超出范围时,内部的线程会停止,显然没有通知。

你应该如何做到这一点:

  

MyClass * c = new MyClass(process);

自己处理生命。

是否有一种简单,好的方法,禁止本地实例化,只允许" new"在c ++?

干杯!

Valmond

3 个答案:

答案 0 :(得分:6)

您可以将类的析构函数设为private(并为释放定义替代成员函数)。这禁止任何类的直接堆栈实例化,只允许堆(new)实例化。

注意:这比将构造函数设置为私有更好,因为仍然可以直接创建对象而不是通过函数创建对象。此外,只有一个析构函数需要私有化,但可能有许多构造函数。

要执行删除操作,您可以执行以下操作:

struct MyStruct
{
    void free()
    {
        delete this;
    }

private:
    ~MyStruct() {};

};

int main()
{
    MyStruct* s = new MyStruct;
    s->free();
}

答案 1 :(得分:4)

您可以将构造函数设为私有,然后通过友元函数允许实例​​化,该函数始终通过新的

进行实例化

答案 2 :(得分:3)

“你应该怎么做...... new MyClass。”不,那不是你应该怎么做的。那是在要求内存泄漏。

更好的方法是

class MyClass {
  MyClass(Process const&);
public:
  static std::unique_ptr<MyClass> make(Process const&);
}

这确实可以防止来电者写MyClass c {process};

当然,你对new MyClass的想法和这个想法都不是绝对的预防。两个指针都必须存储在某个地方。存储在函数本地std::unique_ptr<MyClass>中会导致与您最初相同的问题。