防止创建具有静态生存期的对象

prevent creation of object with static lifetime

本文关键字:生存期 对象 静态 创建      更新时间:2023-10-16

我们能否防止创建具有静态生存期的对象,同时允许创建具有自动生存期的对象?

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

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

没有语言功能可以在编译时提供帮助。但是在运行时,您可以使用下面的技术来限制。假设您不希望MyObjectstatic存储区域上,那么在析构函数中添加如下代码:

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
}

现在是一个事实,在main()结束后,在static存储中声明的变量将消失其生存期(调用析构函数)。因此,如果变量是在static存储上声明的,它的析构函数将打印一条错误消息(在file或stdout中)。

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

在wikibooks中有一个要求或禁止基于堆的对象的收据。

关键是要使类析构函数受到保护,以便使用静态创建的对象将生成编译时错误。缺点是您必须为您的类实现和调用一个单独的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
}