匿名对象可以在C++中声明为静态吗?
问题描述:
这是允许的吗? :匿名对象可以在C++中声明为静态吗?
class A;
void foo()
{
static A();
}
我得到的信号11,当我尝试做,但以下工作正常:
class A;
void foo()
{
static A a;
}
谢谢。
答
没有。在C++中没有这样的“匿名对象”。定义一个类型为A的对象会立即被丢弃;你写的是一个表达式,它返回一个永远不会分配给变量的A对象,就像printf的返回码通常不会被分配或使用一样。
在那段代码中,如果它有效,你会声明“no object”被分配到堆外部。由于没有分配对象,所以没有意义。
答
您可以创建一个“匿名”自动变量,但不是一个静态变量。以下将创建类A的对象并调用构造函数,然后在函数出口调用析构函数。
class A;
void foo()
{
A();
}
你可以通过在预先分配的位置在堆上分配或constructing it in place对象得到类似的效果。
void foo()
{
new A();
}
void foo()
{
static char memory[sizeof (A)];
new (memory) A();
}
但是,在这两种情况下,都无法正确清理对象,因为指针未被保留以供以后的删除调用使用。即使静态内存将被释放,析构函数也不会被调用。匿名对象只有在与垃圾收集器一起使用时才真正使用。
答
不知何故,我认为这个人的单身构造函数的副作用后。
无论如何,只是给了事物一个变量名已经。
这就是为什么我发现自己在看这个问题(7年后)。我想创建一个具有全局作用域的对象,但我不希望它有一个名称。它在其构造函数中注册了一些其他对象,所以它不需要名称。 – 2015-05-17 18:48:54