我有一个用于自动过程监控的帮助程序,因为它有点像一个"火灾和忘记"机制,一个很大的缺陷就是你可以像这样使用它:
MyClass c(过程);
但是当c超出范围时,内部的线程会停止,显然没有通知。
你应该如何做到这一点:
MyClass * c = new MyClass(process);
自己处理生命。
是否有一种简单,好的方法,禁止本地实例化,只允许" new"在c ++?
干杯!
Valmond
答案 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>
中会导致与您最初相同的问题。