复制并修改shared_ptr

时间:2018-05-30 08:50:02

标签: c++

我想知道如何"复制"一个shared_ptr并修改内容。

在以下示例中,"模板人员"已创建,我想将其用作" Person"每个人都会从中复制。但是,当为std :: shared_ptr p2分配template_person时,p2中的每个修改都会影响template_person。有没有办法避免这种情况,还是应该使用普通指针?

这是我的第一个方法。我想这样做以减少内存消耗。

#include <iostream>
#include <memory>
#include <string>

class Person{
public:
    ~Person() {}
    Person(int a, std::string b) : age_(a), name_(b) {}

    void set_age(int x) { age_ = x; }
    int age() { return age_; }

private:
    int age_;
    std::string name_;
};

int main () {

    std::shared_ptr<Person> template_person = std::make_shared<Person>(10, "test");

    std::shared_ptr<Person> p2 = template_person;

    p2->set_age(20);

    std::cout << p2->age() << " " << template_person->age() << std::endl;
    //prints 20 20

    return 0;
}

3 个答案:

答案 0 :(得分:4)

我认为你忽略了共享指针的意义。通过拥有一个指向Person实例的共享指针,您可以说Person是一个共享资源,也就是说,无论您使用什么shared_ptr实例访问该资源,您都将永远是更改相同的资源。

您想要实现的只是复制Person对象。假设你有一个合格的拷贝构造函数(在你的情况下很简单),只需删除共享指针和copy-construct p2

int main () {
    Person template_person {10, "test"};

    Person p2 = template_person;

    p2.set_age(20);

    std::cout << p2.age() << " " << template_person.age() << std::endl;
}

答案 1 :(得分:2)

使用复制构造函数:

auto p2 = std::make_shared<Person>(*template_person);

答案 2 :(得分:1)

您似乎想要“深层复制”而不是“共享”对象 智能指针的作用类似于原始指针,因此如果通过指向它的指针之一进行任何更改,共享资源就会改变。
所以请使用复制构造函数而不是std :: shared_ptr。

const server = new http.createServer()
const wss = new WebSocket.Server({ server })

wss.on('connection', (ws, req) => {
  console.log(req.url)
})