首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++字符串文字的安全性和可靠性如何?

C++字符串文字的安全性和可靠性如何?
EN

Stack Overflow用户
提问于 2010-04-30 04:53:58
回答 2查看 2.7K关注 0票数 7

所以,我想更好地掌握C++中字符串的工作原理。我最关心的情况是,将字符串的地址赋给一个指针,并将其传递出去。例如:

代码语言:javascript
复制
char* advice = "Don't stick your hands in the toaster.";

现在假设我只是通过在程序的持续时间内复制指针来传递这个字符串。当然,这可能不是一个好主意,但我很好奇幕后到底会发生什么。

再举一个例子,假设我们创建了一个返回字符串文字的函数:

代码语言:javascript
复制
char* foo()
{
    // function does does stuff
    return "Yikes!"; // somebody's feeble attempt at an error message
}

现在假设这个函数经常被调用,而字符串文字只在调用时使用了大约一半的时间:

代码语言:javascript
复制
// 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)。我主要是想知道这些情况是否会导致内存管理或数据损坏的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-30 04:57:10

字符串-文字的类型为const char[N] (其中N是长度+ 1),并且是静态分配的。您不必担心内存问题;如果在您的程序中使用了一个字符串,那么它将全部为您处理,并驻留在程序内存中的某个位置(通常是只读的)。

也就是说,这些是“相同的”:

代码语言:javascript
复制
static const char str[] = "a string";
"a string"

当您指向字符串文字时,您将指向数组中的第一个字符。实际上,因为类型是const char[],所以只有通过const char*指向它才是安全的。从字符串到char*的转换已被弃用,并且不安全。

代码语言:javascript
复制
// 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)
票数 22
EN

Stack Overflow用户

发布于 2010-04-30 04:59:49

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2740712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档