我主要有变量:
ProcessManager mng;
MemoryManager mem;
dysk disk;
并且我正在尝试使用这些指针(也在main中使用)
std::shared_ptr<MemoryManager> wsk= std::make_shared<MemoryManager>(mem) ;
std::shared_ptr<dysk> wsk_d = std::make_shared<dysk>(disk);
将这些对象传递给我的另一个对象的实例(通过构造函数:
Interpreter interpreter(wsk,wsk_d);
但是看起来解释器创建了自己的磁盘实例,为什么?
class Interpreter
{
private:
std::shared_ptr<PCB> pcb;
std::shared_ptr<MemoryManager> mm;
std::shared_ptr<dysk> disk;
}
答案 0 :(得分:5)
这就是std::make_shared
所做的:使用传递的参数创建一个新对象,以传递给合适的构造函数。您的情况是复制构造函数。
即声明
std::shared_ptr<MemoryManager> wsk= std::make_shared<MemoryManager>(mem);
等同于
std::shared_ptr<MemoryManager> wsk(new MemoryManager(mem));
如果您希望共享指针引用现有对象,则需要使用例如
std::shared_ptr<MemoryManager> wsk(&mem);
但是这会带来其他问题,因为当最后一个共享指针被破坏时,它将尝试释放内存,这对于非new
创建的对象是不可能的。有两种解决方法:要么创建(或使用现有的) null-deleter ,它实际上delete
什么都没有。或者通过让共享指针处理对象的完整所有权(从创建到销毁)。
这实际上就是您应该如何看待智能指针,而不是将其视为一种自删除指针,而是从资源所有权的角度来看。