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

时间:2010-04-29 20:53:58

标签: c++ string memory-management 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)。我大多只是想知道这些情况是否会导致内存管理或数据损坏的问题。

2 个答案:

答案 0 :(得分:22)

字符串文字的类型为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)

答案 1 :(得分:1)

首先,将foo的返回值声明为const,因为字符串文字是在不引起可怕的“未定义行为”的情况下无法更改的常量。然后,这将强制使用foo的返回值的任何指针也被声明为const,并可能限制可能(通常是无意中)完成的损坏。字符串文字存储在二进制可执行文件的“文本”区域中 - 它们不是在运行时创建的。