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

C++ 在C+中初始化静态指针+;,c++,pointers,static,initialization,C++,Pointers,Static,Initialization,我有一个带有静态成员的类,它是一个指针,如下所示: Animation::m = new QString("testing"); 动画.h class Animation { public: Animation(); static QString *m; }; animation.cpp #include "animation.h" QString* Animation::m = 0; Animation::Animation() { } 当我尝试从另一个类初始化“m

我有一个带有静态成员的类,它是一个指针,如下所示:

Animation::m = new QString("testing");
动画.h

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

};
animation.cpp

#include "animation.h"

QString* Animation::m = 0;

Animation::Animation()
{
}
当我尝试从另一个类初始化“m”指针时,如下所示:

Animation::m = new QString("testing");
它起作用了

但当我这样做的时候:

QString x("Testing");
Animation::m = &x;
程序崩溃了

第二种方法有什么问题

另外,我希望静态指针是私有的,这样我就可以为它生成静态getter和setter函数。setter应该使用第二种方法,因为“x”将进入一个参数,所以我被卡住了


谢谢你的帮助

我打赌它不会在那条线上崩溃,而是在那之后

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

就像以下行为是非法的一样:

int* x = NULL;
{
   int k = 3;
   x = &k;
}
*x = 4;
解决方法分配给值,而不是指针(前提是它以前分配给了有效的
QString*
):


第二种方法有什么问题?

它崩溃是因为您很可能在创建
x
的范围之外访问它

一旦控件退出创建自动变量的作用域
{
},自动变量就会自动销毁,因此在该作用域之外,您拥有的是指向不存在的数据的指针。访问此数据会导致未定义的行为和崩溃

怎么做?


您应该动态分配内存,然后将字符串复制到动态分配的指针,以便您可以在任何地方访问它。这样,字符串将保持有效,除非并直到显式地
delete
ed.

我敢打赌,在
x
被销毁(可能超出范围)后使用
Animation::m
时,程序将崩溃

如果要使用setter指定给
Animation::m
,则需要将参数作为指针或引用传入:

class Animation
{
public:
    Animation();

    void set_m( QString* ptr) {
        m = ptr;
    }

    void set_m( QString& ref) {
        m = &ref;
    }

private:
    static QString *m;

};

但是,当您尝试使用
m
*(Animation::m)=x时,仍然需要确保任何
m
点仍然处于活动状态
遵从
0
指针。指针从未分配过,只是初始化为
0
。前提是它以前被分配给有效的
QString*
你确定这是正确的吗?@Als我是,直到你问这个问题:))这就像-这是我们可以使用的最有效的算法吗-嗯,我一直这么认为,直到现在!