代码之家  ›  专栏  ›  技术社区  ›  Igor

C++中的匿名对象可以声明为静态的吗?

  •  2
  • Igor  · 技术社区  · 16 年前

    允许这样做吗?:

    class A;
    void foo()
    {
        static A();
    }
    

    我试着做的时候收到信号11,但以下工作正常:

    class A;
    void foo()
    {
        static A a;
    }
    

    谢谢您。

    4 回复  |  直到 15 年前
        1
  •  4
  •   Charlie Martin    16 年前

    不。C++中没有所谓的“匿名对象”。有这样一种情况,即将对象定义为类型A,然后立即丢弃;您所编写的表达式将返回从未分配给变量的对象,例如printf的返回代码通常从未分配或使用。

    在该代码中,如果它起作用,您将声明“no object”被分配到堆外。因为没有对象可分配,所以没有意义。

        2
  •  4
  •   Community kfsone    7 年前

    可以创建“匿名”自动变量,但不能创建静态变量。下面将创建类A的对象并调用构造函数,然后在函数出口调用析构函数。

    class A;
    void foo()
    {
        A();
    }
    

    通过在堆上分配对象或 constructing it in place 在预先分配的位置。

    void foo()
    {
        new A();
    }
    
    void foo()
    {
        static char memory[sizeof (A)];
        new (memory) A();
    }
    

    但是,在这两种情况下,都无法正确地清除对象,因为没有为以后的删除调用保留指针。即使静态内存将被释放,也不会调用析构函数。匿名对象只在与垃圾收集器一起使用时才真正生成。

        3
  •  3
  •   Joshua    16 年前

    不知怎么的,我认为这家伙是在追求一个单体构造器的副作用。

    不管怎么说,只要给该死的东西一个变量名就行了。

        4
  •  0
  •   GiM    15 年前

    当然 C++中的匿名对象! A(100) is anonymous object 在这个样本中

    但是,如果您考虑一下,创建静态匿名对象是没有意义的。