2010-04-29 84 views
7

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

+8

C++字符串文字是完全安全可靠的。这是使用不安全可靠的字符串文字的程序员。 – 2010-04-29 21:16:25

+0

这就是我的想法;我想我只需要保证。谢谢。 :) – 2010-04-29 21:21:16

回答

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) 
+5

“从字符串文字到char *的转换已被弃用,并且不安全。”是啊。需要 - 可写字符串,如果你在某个地方做过。无论如何,不​​要这样做。 – Joshua 2010-04-29 21:02:10

+1

是的,谢谢你详细解释const方面。我意识到他们是不变的,但我想我会把解释交给那些比我更了解他们的人。:) – 2010-04-29 21:08:20

+2

你已经说了一切,据我所知。 – 2010-04-29 21:09:29

1

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