다음 코드 한 : 내가 컴파일C++ 함수가 벡터 <shared_ptr<>>을 반환하면 어떻게됩니까?
#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
함수에서 list
main
로 이동 될 것입니다 따라서 아무 개체가 삭제됩니다/프로세스에서 재현?
피할 수 있습니까? (분명히이 코드는 최적이 아닙니다)?
'Test()'를 사용하여 임시'Test' 개체를 만듭니다. 그 복사본이'make_shared'에 의해 만들어지면 임시 파일이 파괴됩니다. 효율을 위해'std :: make_shared()' –
'return std :: move (list);'는'return list;'이어야한다. –
^^ This. OP : 당신의 컴파일러가 이것에 대해 경고하지 않는다면, 아마도 더 나은 컴파일러를 얻거나 (또는 경고를 켜는) 시간을 갖을 것입니다.'std :: move()'는 리턴 값 최적화를 금지한다. clang의 최신 버전에서 이에 대해 경고 할 수 있습니다. – marko