-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();。これは1回だけ実行されることが保証されます。

文字列の長さを2回保存しても意味がないため、コード全体を次のように簡略化できます。

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.length0になります。

注:コードが単にを返すように宣言されて&nameいる間、これはポインタです。myStructmyStruct

于 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 に答える