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

上一篇: How safe and reliable are C++ String Literals?

下一篇: Regular expression for a string literal in flex/lex