gpt4 book ai didi

C++ 当函数返回 vector> 时会发生什么?

转载 作者:太空狗 更新时间:2023-10-29 23:43:46 25 4
gpt4 key购买 nike

我有以下代码:

#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 move 到 list 中,因此在此过程中不会删除/重新创建任何对象?

可以避免这种情况吗(显然这段代码不是最优的)?

最佳答案

2 个变化:

std::vector<std::shared_ptr<Test>> makeList()
{
std::vector<std::shared_ptr<Test>> list;

// make_shared does not need a copy of an object, just constructor arguments
list.push_back(std::make_shared<Test>());

// return std::move(list) will defeat RVO. Never do that.
return list;
}

所以,重要的部分是:

    list.push_back(std::make_shared<Test>(Test()));

->

    list.push_back(std::make_shared<Test>());

只是为了澄清,因为我今天也有同样的情况,但我很难看出差异。

关于C++ 当函数返回 vector<shared_ptr<>> 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41651421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com