2013-02-15 31 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;