具有new运算符的类中的静态成员变量

时间:2017-08-24 06:54:47

标签: c++

我可以在C ++中使用new声明静态数据成员吗? 如果我们可以用new声明静态数据成员,如何初始化那个静态数据成员?

class A
{ 
    static int *p = new int;     
}

int * A :: p = 

1 个答案:

答案 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智能指针)。