2017-01-15 2 views
4

私は現在vulkanを学習しています。私はこれを見たとき関数内に埋め込まれたconst char *のベクトルを返すことはよく定義された振る舞いですか?

#define SOMESTRING "Hello World!" 

std::vector<const char*> buildVector() { 
    std::vector<const char*> vec; 
    vec.push_back(SOMESTRING); 
    return vec; 
} 

は、私が思っていた:これは、動作を定義している?チュートリアルの一つで、私は、大きく以下のない機能を見て文字列の内容はスタックに置かれていないので、関数が返っても無効です。これが未定義の振る舞いであれば、これを行う正しい方法は何でしょうか?残念ながら、std::stringを使用することは、エンバカンAPIのためにオプションではありません。

+1

'const char * stuff(){return SOMESTRING;と同じです。 } '。このベクターはここで何も魔法を使わない。 – juanchopanza

+3

文字列リテラルは、静的な格納期間を持つ左辺値です。 –

答えて

2

ありSOMESTRINGのスコープが静的ストレージに属している、つまり文字列リテラルがプログラム実行の完全な有効期間を持つためです。これはあなたの場合です。 - OK

  • #define SOMESTRING "Hello World!"
    :ここ

    は、様々なシナリオです。文字列リテラルは静的記憶域に格納されます&したがって、プログラムの最初から最後までの寿命は

  • const char* SOMESTRING = "Hello World!"
    -です。同上。
  • char SOMESTRING[] = "Hello World!";
    - これが静的またはexternスコープで宣言されていればOKです。
    - この配列が関数内で宣言されている場合、BAD。
  • char* SOMESTRING = new char[X]; strncpy(SOMESTRING, "Hello World!", N);
    - 文字列のストレージが現在フリーストア(つまりヒープ)にあるため、&は削除されるまでそのままです。メモリリークを防ぐために がvectorに格納されている必要があります。

BTW、std::vectorは、動作の定義/定義解除に影響しません。ここでは、上記のように参照されるC文字列のみに依存します。

+1

'SOMESTRING'には「スコープ」がありません。これはマクロで、その拡張は名前ではなく文字通りです。名前にはスコープしかありません。そして、「完全な生涯」はC++の生涯の一種ではありません。 –

+0

私はそう思います。それは非常に明確ではない。 –

関連する問題