我可以在C ++中使用new声明静态数据成员吗? 如果我们可以用new声明静态数据成员,如何初始化那个静态数据成员?
class A
{
static int *p = new int;
}
int * A :: p =
答案 0 :(得分:3)
要做的就是在类中声明变量并在其外部初始化它:
class A {
public:
static int* anIntPointer; //<- declaration
};
int* A::anIntPointer = new int(42); //<- initialisation
但是你仍然需要手动清理那个内存,因为当程序结束时只有指针被删除但它指向的内存仍然存在(除非你的操作系统跟踪内存并在程序结束后清理) 。所以请致电delete A::anIntPointer
,例如在main
的末尾。
如果您确实可以访问C ++ 17,但是您可以声明成员inline
,它允许您直接初始化它。
class A {
public:
inline static int* anIntPointer = new int(42); //<- declaration + initialisation
};
无论如何,如果您不想自己负责清理内存,可以使用智能指针(std::auto_ptr<>
之前的C ++ 11,std::unique_ptr<>
C ++ 11及更高版本。
class A {
public:
static std::unique_ptr<int> anSmartPointer;
};
std::unique_ptr<int> A::anSmartPointer = std::unique_ptr<int>(new int(42)); // C++11
// std::unique_ptr<int> A::anSmartPointer = std::make_unique<int>(42); // or C++14 style
当A::anSmartPointer
在程序结束时被销毁时,它会自动清理它所控制的内存。
Here你可以看到我刚才解释过的所有事情的工作示例以及其他一些事情(比如C ++ 17 inline static
智能指针)。