我在使用""
初始化std :: string变量时遇到问题(即空字符串)。它导致以前工作的代码中的奇怪行为。以下陈述是错误的吗?
std::string operationalReason = "";
当我使用以下代码时,一切正常:
std::string operationalReason;
operationalReason.clear();
我认为字符串文字存储在一个独立于编译器的内存位置。我看到的问题实际上是否表明存储器已损坏?如果是这样,我将使用clear()
函数隐藏它。
感谢。
答案 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()
将其重置为空字符串。