簡體   English   中英

C ++ String Literals的安全性和可靠性如何?

[英]How safe and reliable are C++ String Literals?

所以,我想更好地掌握C ++中的字符串文字是如何工作的。 我主要關注的是你將字符串文字的地址分配給指針並傳遞它的情況。 例如:

char* advice = "Don't stick your hands in the toaster.";

現在讓我說我只是通過在程序的持續時間內復制指針來傳遞這個字符串。 當然,這可能不是一個好主意,但我很好奇幕后會發生什么。

再舉一個例子,假設我們創建一個返回字符串文字的函數:

char* foo()
{
    // function does does stuff
    return "Yikes!"; // somebody's feeble attempt at an error message
}

現在讓我們說這個函數經常調用,字符串文字只用了大約一半的時間:

// situation #1: it's just randomly called without heed to the return value
foo(); 

// situation #2: the returned string is kept and used for who knows how long
char* retVal = foo();

在第一種情況下,實際發生了什么? 字符串剛剛創建但未使用,並且從未取消分配?

在第二種情況下,只要用戶發現需要它,字符串是否會被維護? 當不再需要它時會發生什么......那個存儲器會被釋放(假設沒有任何東西指向那個空間)?

不要誤會我的意思,我不打算像這樣使用字符串文字。 我打算使用容器來檢查我的字符串(可能是std :: string)。 我大多只是想知道這些情況是否會導致內存管理或數據損壞的問題。

字符串文字的類型為const char[N] (其中N是長度+ 1)並且是靜態分配的。 你不必擔心內存問題; 如果你的程序中使用了一個字符串,它將全部為你處理,並駐留在程序存儲器中的某個地方(通常是只讀的)。

也就是說,這些是“相同的”:

static const char str[] = "a string";
"a string"

當您指向字符串文字時,您指向數組中的第一個字符。 實際上,因為類型是const char[] ,所以通過const char*指向它是安全的。 從字符串文字到char*的轉換已棄用,並且不安全。

// the "same"
static const char str[] = "a string";
const char* strPtr = str; // decays

const char* s1 = "a string";
char* s2 = "a string"; // allowed, implicit const_cast

*s1 = 'A'; // not allowed, it's const
*s2 = 'B'; // allowed, it's not const (but leads to undefined behavior)

首先,將foo的返回值聲明為const,因為字符串文字是在不引起可怕的“未定義行為”的情況下無法更改的常量。 然后,這將強制使用foo的返回值的任何指針也被聲明為const,並可能限制可能(通常是無意中)完成的損壞。 字符串文字存儲在二進制可執行文件的“文本”區域中 - 它們不是在運行時創建的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM