10

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

std::string operationalReason = "";

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

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

我相信字符串文字存储在依赖于编译器的单独内存位置。我看到的问题实际上是否表明该存储已损坏?如果是这样,它会被我对该clear() 函数的使用隐藏起来。

谢谢。

4

4 回答 4

30
std::string operationalReason; //is enough!

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

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

于 2011-03-18T15:23:26.473 回答
12

std::string operationalReason = "";

从技术上讲,这很好,但更常见和更好的是

std::string operationalReason;

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

是的,关于将字符串文字存储在不可变内存等等等等方面你是对的……但是字符串 copy-ctor 总是复制传递的字符串或 C 字符串

于 2011-03-18T15:22:47.003 回答
6

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

当您使用""表单或稍后在运行时,您的代码会立即崩溃吗?您是否能够在 valgrind 或类似工具下运行它以查看它是否发现内存问题?如果您将字符串初始化为除 之外的其他文字会发生什么""

于 2011-03-18T15:50:05.840 回答
-4

这两种形式都得到了纠正,但这是一种:

std::string operationalReason = ""

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

std::string operationalReason;

更可取。您可以使用clear()将其重置为空字符串。

于 2011-03-18T15:38:24.057 回答