我想知道如何"复制"一个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;
}
答案 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)
})