阻止使用静态生命周期创建对象

时间:2011-07-05 18:46:38

标签: c++ static stack heap

我们可以阻止创建具有静态生命周期的对象,同时允许使用自动生命周期创建对象吗?

如果我们想阻止用户创建具有自动持续时间的类的实例,我们可以将析构函数设为私有。如果我们想阻止用户使用动态分配创建实例,我们可以将operator new设为私有。

我认为不可能阻止用户创建具有静态存储持续时间的对象,因为唯一的区别是生命周期。但也许这里的一些专家可以设计一种方式。

2 个答案:

答案 0 :(得分:3)

没有语言工具有助于编译时。但在运行时,您可以使用以下技术限制。假设您不希望在MyObject存储区域static,请在析构函数中添加代码:

bool ALLOW_OBJECTS = false;  // global variable
struct MyObject  // class body
{
 ~MyObject ()
  {
    if(ALLOW_OBJECTS == false)
      <print error message>
    // ...
  }
};

现在,在main()方法中,您可以ALLOW_OBJECTS

int main ()
{
  ALLOW_OBJECTS = true;  // objects can be created now
// ... other code
  ALLOW_OBJECTS  = false;  // reset to 'false' before main() ends
}

现在,在static存储中声明的变量在main()完成后消失了它们的生命周期(调用析构函数)。因此,如果在static存储上声明了变量,则其析构函数将打印错误消息(在文件或标准输出中)。

通过此检查,您的1次执行测试运行可能会失败,但您可以在找到错误消息数后手动更正代码。因此,在您的生产代码中,您可以删除所有这些调试语句,并且您的代码没有任何 static 存储对象! (不适用于POD和指针)。

答案 1 :(得分:0)

Requiring or Prohibiting Heap-based Objects维基书上有一张收据。

关键是要保护类析构函数,以便使用静态创建的对象将生成编译时错误。缺点是您必须为类实现并调用单独的 delete 方法。

class HeapOnly {
  public:
    HeapOnly() {} 
    void destroy() const { delete this; }
  protected:
    ~HeapOnly() {}
};
HeapOnly h1;     // Destructor is protected so h1 can't be created globally
HeapOnly func()  // Compiler error because destructor of temporary is protected
{
  HeapOnly *hoptr = new HeapOnly; // This is ok. No destructor is invoked automatically for heap-based objects
  return *hoptr;
}
int main(void) {
  HeapOnly h2; // Destructor is protected so h2 can't be created on stack
}