-2

我有以下代码:

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 namename.length将等于0

4

4 回答 4

0

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

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

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

甚至:

static const char * const name = "BLABLA";
于 2013-02-15T16:02:50.533 回答
0

是的,name.length将是 0。

注意:您返回&name的是指向 a 的指针,myStruct而您的代码被声明为仅返回 amyStruct

于 2013-02-15T16:04:08.807 回答
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 的空字符串。

于 2013-02-15T16:04:45.840 回答
0

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

目前的代码是安全的,因为静态变量被初始化为零。(更多信息

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

编写的代码看起来好像没有初始化,但实际上它是。我认为至少您需要添加评论:

/* structure is initialized to all-zeros because it is static */
static myStruct name;
于 2013-02-15T16:08:12.423 回答