7

所以,我想更好地了解 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)。我主要只是想知道这些情况是否会导致内存管理或数据损坏的问题。

4

2 回答 2

23

字符串文字具有类型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)
于 2010-04-29T20:57:09.573 回答
1

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

于 2010-04-29T20:59:48.970 回答