根据一篇文章(这里和那里),这段代码是一个错误的使用后免费示例:
#include <iostream>
#include <string>
#include <string_view>
int main() {
std::string s = "Hellooooooooooooooo ";
std::string_view sv = s + "World\n";
std::cout << sv;
}
Run Code Online (Sandbox Code Playgroud)
文章中说使用strings 时将释放 s string_view!这与我的调试经验背道而驰。但我要求您确认/验证/检查这一点。
根据我的经验,堆栈/范围变量在范围退出时被释放(调用析构函数将是更正确的措辞)。这意味着在这种情况下,这将发生在std::cout << sv;
但是我从来没有使用过string_view,所以我不知道这个对象的任何内部机制。
如果确实是危险行为,您能解释一下吗?否则,我很高兴阅读确认范围变量析构函数仅在当前范围的退出时被调用,自然地,或者在抛出异常时,中断当前范围内的线程。
编辑:在前两个答案之后,它确实是一个使用后免费使用。
附属问题:你认为我们可以在string_view的定义中添加一个带有delete关键字的移动构造函数来禁止吗?