在类上使用静态动态变量是否可能或有意义,用new运算符初始化?
答案 0 :(得分:2)
这可能没什么意义,但你当然可以这样做:
static int * p = new int(1);
问题在于破坏对象。这可能在实践中并不重要,除非析构函数有一些你需要的副作用(例如写入文件),在这种情况下静态智能指针将(可能)完成这项工作。
话虽如此,
static int i = 1;
在几乎所有情况下都会更好。
编辑:我误解了你的问题,但我会把它留在这里,因为它确实建议模糊的好习惯。
答案 1 :(得分:2)
你的意思是以下?是的,这是允许的。
class Class {
static Base *b;
};
Base *Class::b = new Derived();
如果需要在程序退出时将其销毁,请使用智能指针
class Class {
static boost::scoped_ptr<Base> b;
};
boost::scoped_ptr<Base> Class::b(new Derived());
答案 2 :(得分:1)
如果你想确保在程序退出后清理它:
struct foo
{
static double* d;
};
namespace
{
void delete_double(void)
{
delete foo::d;
}
double* get_double(void)
{
double* result = new double();
atexit(delete_double);
return result;
}
}
double* foo::d = get_double();
或使用智能指针(请参阅Johannes answer。)
答案 3 :(得分:1)
声明中:
static cMyClass* p = new cMyClass() ;
将p
称为“静态动态变量”是不正确的。它是cMyClass *类型的静态指针变量,指向动态分配的对象。
通过将其称为“静态动态”变量,您可以将其视为一个悖论,而实际上它只是对可能完全合理的事物的描述不佳。有两个变量:1)指针是静态的,2)是动态的对象。