【发布时间】:2017-11-10 20:26:37
【问题描述】:
我想知道的是,按值返回 Cat 与返回 std::unique_ptr<Cat> 在传递、内存管理和实际使用方面有何不同。
内存管理明智,它们不一样吗?因为值返回的对象和包裹在 unique_ptr 中的对象都会在超出范围后触发其析构函数?
那么,你将如何比较两段代码:
Cat catFactory(string catName) {
return Cat(catName);
}
std::unique_ptr<Cat> catFactory(string catName) {
return std::unique_ptr(new Cat(catName));
}
【问题讨论】:
-
值语义更容易理解和阅读。如果
Cat可以移动构造,则没有理由制作指针。另外,unique_ptr不能被复制。 -
补充一点,
unique_ptr值可以从指针中释放出来,用作动态分配的对象。正如@HenriMenke 指出的那样,价值通常是他们要走的路,但是使用unique_ptr允许您提取对象以供在ptr 范围之外使用。 -
感谢您的意见,伙计们!是的,不实现移动构造函数和移动赋值可能会导致不必要地复制对象的大量开销。 uniq_ptr 的发布 api 似乎也是一个合法的差异化因素
标签: c++ c++11 memory-management unique-ptr return-by-value