我有以下代码:
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
答案 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;