2013-02-15 29 views
-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 name之后,name.length将等于0

+3

请不要在C++中输入结构体。将字符串长度存储两次也没有意义,并且您的代码也不会编译。 – 2013-02-15 16:05:28

+0

这里的“价值”是什么? – juanchopanza 2013-02-15 16:06:56

+0

当你可以访问name.size()时,你为什么需要这个长度?你真的需要这个结构还是只是一个简单的例子? – andre 2013-02-15 16:13:45

回答

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的空字符串。

+1

完全删除'length'数据成员会更安全。 – juanchopanza 2013-02-15 16:22:43

0

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

由于也有在存储两倍的字符串长度没有意义的,你的整个代码可以简化为这样:

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

甚至:

static const char * const name = "BLABLA"; 
+0

@Kerek但结构是静态的 – 2013-02-15 16:03:40

+0

@IvayloStrandjev:D'哦,当然 - 谢谢! – 2013-02-15 16:05:06

0

是,name.length将为0

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

0

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

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

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

这样的代码使它看起来像像初始化不在玩,当它实际上是。 我认为你至少需要添加一条评论:

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