如何使用""初始化std::string?

11

我在使用""(空字符串)初始化一个std::string变量时遇到了问题。这导致之前正常运行的代码出现奇怪的行为。以下语句是否有误?

std::string operationalReason = "";

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

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

我认为字符串文字存储在一个与编译器相关的单独内存位置。我看到的问题可能实际上表明那个存储被损坏了吗?如果是这样,clear()函数将掩盖它。

谢谢。


“我看到的问题是否可能表明存储已经损坏?” <-- 不是。如果是这样,你会遇到许多其他问题,例如系统不稳定。你提供的代码没有理由不能工作。 - jcolebrand
“存储数据的损坏”-虽然不太可能,但如果在执行“std :: string operationalReason =“”;”后,‘operationalReason.size()’的值为非0,则说明出现了严重问题。如果其值为0,则可能表明字符串已经被成功创建。 - Steve Jessop
@drachenstern:我尝试使用std::string operationalReason;,但我仍然看到operationalReason作为一个没有可打印字符且长度为16的字符串。这有多奇怪? - Mohsin
@Steve Jessop:我猜一定出了什么大问题,但是我搞不清楚是什么 :( - Mohsin
我需要看更多的代码才能理解为什么它不起作用,至于为什么在创建时分配了16字节的内存,我只能假设这是编译器或运行时环境中的某些问题(C++仍然使用运行时环境,对吧?) - jcolebrand
4个回答

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

它调用默认构造函数,无论如何都会创建一个空字符串。

所以我认为std::string operationalReason = ""有点过头了。


如果operationalReason是局部变量,则不会调用默认构造函数。 - Alex

12

std::string operationalReason = "";

这在技术上是完全没问题的,但更常见和好的方式是

std::string operationalReason;

string的默认构造函数会创建一个空字符串

是的,关于字符串字面量存储在不可变内存中等等…但是字符串复制构造函数总是会复制所传递的字符串或C字符串。


正确。不需要用""初始化字符串,它已经可以使用了。 - Musky

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

您的代码是否会立即在使用""形式时崩溃,还是在运行时稍后崩溃?您能否在valgrind或类似工具下运行此代码以查看是否存在内存问题?如果将字符串初始化为除""之外的某些文字,会发生什么情况?


你说得没错,可能是其他的损坏方式以这种方式展现出来。在使用 = "" 后,代码不会崩溃。而且,在没有使用 = "" 的简单声明后,行为仍然是不正确的。我将使用 Valgrind 来查找问题。 - Mohsin

-4
这两个表单都已经被修正了,但是这一个:
std::string operationalReason = ""

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

std::string operationalReason;

最好使用clear()将其重置为空字符串。


第一个不调用 operator=。那不是赋值! - Nawaz
是的,它调用了以const char *为参数的构造函数。首先它调用默认构造函数,然后尝试复制数据,在这种情况下没有任何数据可复制。 - mik
不,严格来说,它并没有调用默认构造函数,而是使用另一个构造函数,从 "" 复制了“所有”字符。尽管如此,结果仍然是一个空的 std::string。 - Bo Persson
1
-1:它不调用默认构造函数。 -1:建议立即使用clear()std::string operationalReason;已经是空字符串了。 - Robᵩ
感谢您的评论。我猜测一个没有初始化的声明会创建一个空字符串,但我仍然遇到了使用它时的问题,这些问题通过clear()函数得到了解决。 - Mohsin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接