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

C++ 防止创建具有静态生存期的对象,c++,static,stack,heap,C++,Static,Stack,Heap,我们可以防止创建具有静态生存期的对象,同时允许使用自动生存期创建对象吗 如果我们想阻止用户创建具有自动持续时间的类实例,我们可以将析构函数设置为私有。如果我们想阻止用户创建具有动态分配的实例,我们可以将操作符设置为新的私有 我认为不可能阻止用户创建具有静态存储持续时间的对象,因为唯一的区别是生存期。但是,也许这里的一些专家可以想出一种方法。在编译时,没有任何语言工具可以提供帮助。但在运行时,您可以使用下面的技术来限制这一点。假设您不希望MyObject位于static存储区域,则将代码添加到析构

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

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


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

在编译时,没有任何语言工具可以提供帮助。但在运行时,您可以使用下面的技术来限制这一点。假设您不希望
MyObject
位于
static
存储区域,则将代码添加到析构函数中,如下所示:

bool ALLOW_OBJECTS = false;  // global variable
struct MyObject  // class body
{
 ~MyObject ()
  {
    if(ALLOW_OBJECTS == false)
      <print error message>
    // ...
  }
};
现在,在
static
storage中声明的变量在
main()
完成后将消失其生存期(调用析构函数)。因此,如果变量在
静态
存储器上声明,其析构函数将打印错误消息(在文件或标准输出中)


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

维基百科上有收据

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

为什么,为什么,你到底为什么要这么做。这完全是浪费时间和精力。@VJo“我们可以只在静态存储区域上创建对象,同时允许在堆栈上创建对象。”@cat++我也在想为什么有人想限制堆栈和堆上的对象。但我看到人们为某些特定的进程指定了动态内存。类似地,我认为可能有人也想指定静态内存。@Amar:这些也很愚蠢,只是不要,没有合理的使用案例。这是一个彻底的设计失败,就像一个单件一样,只是更糟。@Amar,这是一个非常不寻常的请求。请再解释一点,以便我们了解其背后的原因,也许您的问题有不同的答案。这不包括函数中定义的
静态
变量。
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
}