std::string的swap成员函数这种用法是否合法,是否会产生未定义行为?
结论
你给出的两个代码示例中std::string的swap成员函数用法完全合法有效,不会产生未定义行为,你的初始理解完全正确。
原理说明
std::string::swap的作用是常数时间内交换两个字符串的内部底层数据(堆内存指针、长度、容量属性),不会复制字符串的实际内容,C++标准明确要求该操作不抛出异常。- 你在函数内创建的栈上局部
newString对象,其持有的字符串内容存储在堆(自由存储区)上:交换完成后,入参引用的current会拿到newString所持有的堆资源,newString则拿到原来current持有的旧资源。函数执行结束局部变量newString析构时,会正常释放它所持有的旧资源,全程不会出现悬空指针、内存泄漏或其他未定义行为。 - 该写法的性能优势确实存在:在C11之前没有移动语义的环境下,比「函数返回新字符串再赋值给外部变量」的写法少一次字符串深拷贝开销;即使是C11及之后的版本,
swap的开销和移动构造基本一致,属于高效写法。
补充说明
你第二个外观数列(Look-and-say sequence)的实现逻辑也没有问题,nextString内构造好新字符串后再和入参交换的写法完全符合标准要求,没有安全隐患。唯一可能触发问题的场景是调用方传入的current本身是悬空引用/无效对象,但这属于传参环节的错误,和swap的使用方式无关。
内容的提问来源于stack exchange,提问作者Ajay Singh
相关产品推荐
相关产品推荐

