C++ 如何使用“std::string”初始化std::string&引用;?

C++ 如何使用“std::string”初始化std::string&引用;?,c++,stdstring,C++,Stdstring,我在使用“(即空字符串)初始化std::string变量时遇到问题。它在以前工作的代码中导致了奇怪的行为。下面的说法是错误的吗 std::string operationalReason = ""; 当我使用以下代码时,一切正常: std::string operationalReason; operationalReason.clear(); 我相信字符串文本存储在独立的内存位置,该位置依赖于编译器。我所看到的问题是否表明该存储已损坏?如果是这样,我使用clear()函数会将其隐藏起来 谢

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

std::string operationalReason = "";
当我使用以下代码时,一切正常:

std::string operationalReason;
operationalReason.clear();
我相信字符串文本存储在独立的内存位置,该位置依赖于编译器。我所看到的问题是否表明该存储已损坏?如果是这样,我使用
clear()
函数会将其隐藏起来


谢谢。

std::string::reason=“”

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


std::字符串原因

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

是的,关于字符串文本存储在不可转换内存中的说法是对的等等。。。但是字符串复制构造函数总是复制传递的字符串或C字符串

std::string operationalReason; //is enough!
它调用默认构造函数,并创建一个空字符串


所以我想说,
std::string operationalReason=“
太过分了。

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

std::string operationalReason = ""
它调用以
常量char*
为参数的构造函数。首先,它调用默认构造函数,然后尝试复制数据,在本例中为零

std::string operationalReason;
这是最好的。
您可以使用
clear()
将其重置为空字符串。

如果只执行
std::string操作,会发生什么?这应该与您提供的两个示例具有相同的效果。如果您在使用
std::string operationalReason=“”)时遇到问题表单,它可能指示字符串数据存储已损坏,但也可能意味着内存的其他部分已损坏,并且该特定行导致它以不同的方式显示


当您在运行时使用
窗体或更高版本时,您的代码是否会立即崩溃?您是否能够在valgrind或类似工具下运行此程序,以查看它是否发现内存问题?如果将字符串初始化为除
”以外的其他文字,会发生什么情况?

我看到的问题是否实际表明该存储已损坏?
“该存储已损坏”-不太可能,但如果执行
std::string operationalReason=“”)后
operationalReason.size()
立即为非0,这将证明有些东西出了大问题。如果它是0,那么字符串可能已经创建好了。@drachenstern:我尝试使用
std::string操作原因
但我仍然将operationalReason视为一个字符串,没有可打印字符,长度为16。这有多奇怪?@Steve Jessop:我猜一定是出了什么问题,但我不知道是什么:(~我需要看更多的代码才能理解它为什么不工作,以及它为什么在创建时分配16字节的内存,我只能假设这是在编译器或运行时发生的(C++仍然使用运行时,不是吗?)-1.第一个不调用
运算符=
。这不是赋值!是的,它调用以const char*为参数的构造函数。首先它调用默认构造函数,然后它尝试复制数据,在这种情况下什么都没有。不,严格地说,它不调用默认构造函数,它使用另一个复制“all”的构造函数来自
的字符。但结果是相同的,是一个空的std::string。-1:它不调用deault构造函数。-1:用于建议
清除()
是立即需要的。
std::string operationalReason;
已经是空字符串。谢谢您的评论。我想没有初始化的声明会创建空字符串,但我仍然发现该用法存在问题,并通过clear()进行了更正“正在删除字符串。您有一点,它可能是以这种方式显示的其他损坏。使用
=”
后,代码不会崩溃。此外,在使用没有
=”的简单声明后,该行为仍然不正确。”
。我会看看我能在valgrind.Correct中找到什么。没有必要用“”初始化字符串,现在就开始吧。如果
operationalReason
是局部变量,它不会调用默认构造函数。