【发布时间】:2017-05-29 19:37:35
【问题描述】:
我有以下代码:
#include <iostream>
#include <memory>
#include <vector>
class Test
{
public:
Test() {}
~Test() { std::cerr << "Delete\n"; }
};
std::vector<std::shared_ptr<Test>> makeList()
{
std::vector<std::shared_ptr<Test>> list;
list.push_back(std::make_shared<Test>(Test()));
return std::move(list);
}
int main(int argc ,char **argv)
{
std::vector<std::shared_ptr<Test>> list;
std::cerr << "Before\n";
list = makeList();
std::cerr << "After\n";
return 0;
}
我使用的编译器:
clang++ -std=c++14 -o ptr ptr.cpp
输出是:
Before
Delete
After
Delete
我的问题是:为什么makeList 函数中有一个对象被删除?我的假设是函数中的list 将从main 移动到list,因此在此过程中不会删除/重新创建任何对象?
这可以避免吗(显然这段代码不是最优的)?
【问题讨论】:
-
您使用
Test()创建一个临时的Test对象。然后由make_shared制作一份副本,然后临时文件被销毁。你可能想要std::make_shared<Test>() -
出于效率原因,
return std::move(list);应该是return list;。 -
^^ 这个。 OP:如果您的编译器没有对此发出警告,也许是时候获得更好的编译器(或打开警告)。
std::move()这里禁止返回值优化。最新版本的 clang 可以对此发出警告。
标签: c++ c++11 c++14 shared-ptr move-semantics