对象创建另一个实例,而不是修改指向的实例

时间:2019-01-16 18:00:09

标签: c++ pointers

我主要有变量:

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;
}

1 个答案:

答案 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什么都没有。或者通过让共享指针处理对象的完整所有权(从创建到销毁)。

这实际上就是您应该如何看待智能指针,而不是将其视为一种自删除指针,而是从资源所有权的角度来看。