C ++字符串文字如何安全可靠?
所以,我想更好地掌握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,并且可能会限制可能(通常无意)完成的损害。 字符串文字存储在二进制可执行文件的“文本”区域 - 它们不是在运行时创建的。
链接地址: http://www.djcxy.com/p/72123.html