静态方法中的结构初始化 - 代码安全性

时间:2013-02-15 16:01:17

标签: c++ static

我有以下代码:

typedef struct
{
    string name;
    int length;
}myStruct;

static myStruct getname()
{
    static myStruct name;

    if (name.length == 0)
    {
        name.value = "BLABLA";
            name.length = name.value.size();
    }

    return &name;
}

这段代码安全吗?即我可以保证在构建myStruct name之后,name.length将等于0

4 个答案:

答案 0 :(得分:0)

是的,因为静态变量是零初始化的。但是,您的代码不是线程安全的。最好说static myStruct name = initName();,保证只执行一次。

由于将字符串长度存储两次也没有意义,因此整个代码可以简化为:

static std::string const & getName()
{
    static std::string impl("BLABLA");
    return impl;
}

甚至:

static const char * const name = "BLABLA";

答案 1 :(得分:0)

是的,name.length将为0。

注意:您正在返回&name,这是指向myStruct的指针,而您的代码被声明为只返回myStruct

答案 2 :(得分:0)

struct myStruct {
    string name;
    int length;
    myStruct(string name = "") : name(name), length(name.size()) {} 
};

static myStruct getname() {
    static myStruct name("BLABLA");
    return name;
}

使用构造函数初始化列表,这样更安全。这里将长度初始化为名称的大小,默认为空字符串,其大小为== 0.

答案 3 :(得分:0)

这里有不同的“安全”概念。

现有代码是安全的,因为静态变量初始化为零。 ( for more information

但是,我不认为它“安全”,因为初始化是不明显的 如果另一个程序员试图修改此代码,他们可能没有意识到将name.length初始化为零的重要性,以及static关键字保证初始化的事实。

写入的代码使看起来像一样,初始化不起作用,实际上它是。 我想至少你需要添加评论:

/* structure is initialized to all-zeros because it is static */
static myStruct name;