智能指针复制消除与局部自动存储:unique_ptr是否避免复制?
问题解答
这里不会延长local_line的生命周期,而且make_unique构造新对象时确实会复制local_line。
具体拆解:
local_line是addLine函数内的局部栈变量,函数执行完毕后就会被销毁,unique_ptr完全不会影响它的生命周期。make_unique<Line>(local_line)的本质是在堆上创建一个Line对象,并调用Line的拷贝构造函数,把local_line的内容完整复制到这个堆对象中。之后unique_ptr会接管该堆对象的所有权,直到Page中的这个unique_ptr被释放(比如Page对象销毁,或者对应的元素被移除)。
如果想避免复制,可以改用移动构造:将代码改为make_unique<Line>(std::move(local_line)),这样会把local_line的资源转移到堆对象里,而非复制,效率更高。但要注意,移动后local_line会处于有效但未定义的状态,后续不能再使用它。
内容的提问来源于stack exchange,提问作者ExpertNoob1
相关产品推荐
相关产品推荐

