在C++中初始化静态指针

Yas*_*azk 14 c++ static pointers initialization

我有一个带有静态成员的类,它是一个像这样的指针:

animation.h

class Animation
{
public:
    Animation();
    static QString *m;

};
Run Code Online (Sandbox Code Playgroud)

animation.cpp

#include "animation.h"

QString* Animation::m = 0;

Animation::Animation()
{
}
Run Code Online (Sandbox Code Playgroud)

当我尝试从另一个类初始化那个'm'指针时:

Animation::m = new QString("testing");
Run Code Online (Sandbox Code Playgroud)

有用.

但是当我这样做的时候:

QString x("Testing");
Animation::m = &x;
Run Code Online (Sandbox Code Playgroud)

程序崩溃了.

第二种方法有什么问题?

此外,我希望将该静态指针设置为私有,以便我可以为其创建静态getter和setter函数.setter应该使用第二种方法,因为'x'将出现在参数中,所以我被卡住了.

谢谢你的帮助!

Luc*_*ore 14

我打赌它并没有在那条线上崩溃,而是之后.

问题是你正在获取位于自动内存中的变量的地址,并可能在之后尝试访问它.变量x将在其范围结束时被销毁,但Animation::m仍将指向该内存(在x超出范围后您不再拥有的内存).这导致未定义的行为.

就像以下是非法的:

int* x = NULL;
{
   int k = 3;
   x = &k;
}
*x = 4;
Run Code Online (Sandbox Code Playgroud)

解决方法分配值,而不是指针(前提是它先前已分配给有效QString*):

QString x("Testing");
*(Animation::m) = x;
Run Code Online (Sandbox Code Playgroud)