如何使用“”初始化std :: string?

时间:2011-03-18 15:20:35

标签: c++ stdstring

我在使用""初始化std :: string变量时遇到问题(即空字符串)。它导致以前工作的代码中的奇怪行为。以下陈述是错误的吗?

std::string operationalReason = "";

当我使用以下代码时,一切正常:

std::string operationalReason;
operationalReason.clear();

我认为字符串文字存储在一个独立于编译器的内存位置。我看到的问题实际上是否表明存储器已损坏?如果是这样,我将使用clear()函数隐藏它。

感谢。

4 个答案:

答案 0 :(得分:24)

std::string operationalReason; //is enough!

它调用默认构造函数,并始终创建一个空字符串。

所以我会说std::string operationalReason = ""有点矫枉过正。

答案 1 :(得分:10)

std::string operationalReason = "";

这在技术上非常好,但更常见,更好的只是

std::string operationalReason;

字符串的默认ctor将创建一个空字符串

是的,你是正确的字符串文字存储在一个不可变的内存等等等等...但字符串copy-ctor总是复制字符串或传递的C字符串

答案 2 :(得分:4)

如果你只是做std::string operationalReason;会怎样?这应该与您提供的两个示例具有相同的效果。实际上,当您使用std::string operationalReason = "";表单时可能会遇到问题,这可能表明字符串数据存储已损坏,但它可能同样意味着内存的某些OTHER部分已损坏且该特定行导致它表现不同。

在运行时使用""表单或更高版本时,代码是否会立即崩溃?你是否能够在valgrind或类似的情况下运行它,看它是否发现内存问题?如果您将字符串初始化为""以外的某些文字会发生什么?

答案 3 :(得分:-4)

这两种形式已得到纠正,但这一种形式:

std::string operationalReason = ""

它调用以const char *为参数的构造函数。首先,它调用默认构造函数然后尝试复制数据,在这种情况下没有。

std::string operationalReason;

是优选的。 您可以使用clear()将其重置为空字符串。