2017-01-15 51 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; 
} 

當我看到這一點,我想知道:是這樣定義的行爲?字符串"Hello World!"的內容是不是位於堆棧上,因此一旦函數返回就無效了?如果這是未定義的行爲,那麼執行此操作的正確方法是什麼?不幸的是,由於vulkan API,使用std::string不是一個選項。

+1

與'const char * stuff(){return SOMESTRING; }'。這裏的矢量並沒有做任何奇妙的事情。 – juanchopanza

+3

字符串文字是靜態存儲持續時間的左值。 –

回答

2

,因爲SOMESTRING的作用域屬於靜態存儲,即字符串文字具有程序執行的全部生命週期。這是你的情況。

這裏有各種情況:

  • #define SOMESTRING "Hello World!"
    - 確定。字符串文字存儲在靜態存儲器&中,因此它們的壽命是從程序開始到結束
  • const char* SOMESTRING = "Hello World!"
    - 好的。同上。
  • char SOMESTRING[] = "Hello World!";
    - 好的,如果聲明它是在靜態或外部範圍內聲明的。
    - 壞,如果這個數組是在一個函數中聲明的。
  • char* SOMESTRING = new char[X]; strncpy(SOMESTRING, "Hello World!", N);
    - 好的,因爲字符串的存儲現在在空閒存儲區(即堆)&將保持如此直到它被刪除。值得注意的是,存儲在vector中的字符串 必須被釋放,以防止內存泄漏。

順便說一句,std::vector不會影響行爲的定義/無定義。這僅取決於所提到的C字符串,如上所述。

+1

'SOMESTRING'沒有「範圍」。這是一個宏觀,其擴展是一個文字,而不是一個名稱。只有名字纔有作用域。而「完整生命週期」不是C++中的一種生命週期類型。 –

+0

我想。這不是很清楚。 –

相關問題