因此,我想更好地了解 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)
关于c++ - C++ 字符串文字的安全性和可靠性如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2740712/