为什么复制的字符串被复制复制......?

时间:2016-01-15 08:54:53

标签: c++

想象一下这个简单的简化代码片段:

ostringstream os; 
os << "hello world!";           

string str = os.str().c_str();  // copy of os

list<string> lst;
lst.push_back(str);             // copy of str

在WideString中有一个名为detach()的函数,它赋予被调用函数处理mem-allocation的责任。

字符串类型有这么类似的技巧吗?

2 个答案:

答案 0 :(得分:8)

如果您可以使用C++11,则可以使用move。您可以在此处阅读有关移动语义的信息:What are move semantics?

lst.push_back(std::move(str)); // str is moved

但是在这里:

string str = os.str().c_str();

您从string返回的const char*构造新的c_str,只需删除c_str,然后C ++ 11编译器将调用移动构造函数,而不是新的字符串构造。

答案 1 :(得分:0)

在Qt库中有不同的拷贝写入方法。例如:

QString a = "Hello";   // Create string
QString b = a;         // No copy, `b` has pointer to `a`
a += " world!";        // `b` is copied here, because `a` was modified

关于std::string,C ++ 11尝试使用移动语义来解决这个问题。另一个问题可能是在QString等容器中处理内存管理是个好主意。